1、控制反轉(zhuǎn):
1.1 布局管理器:
JBbutton btnStep=new JButton("單步");
frame.add(btnStep,BorderLayout.NORTH);
- frame成為容器中的部件,部件管理容器---布局管理器;
1.2 控制反轉(zhuǎn):(消息機(jī)制)
btnStep.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按下啦!");
step();
frame.repaint();
}
});
1.3 內(nèi)部類(lèi):在一個(gè)類(lèi)的內(nèi)部定義一個(gè)另外的類(lèi),拿到外面就成為了外部類(lèi)
private class StepListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
step();
frame.repaint();
}
}
- 定義在別的類(lèi)內(nèi)部、函數(shù)內(nèi)部的類(lèi);
- 內(nèi)部類(lèi)能直接訪問(wèn)外部的全部資源;
- 包括任何私有的成員;
- 外部是函數(shù)時(shí),只能訪問(wèn)那個(gè)函數(shù)里final的變量(本地變量);
1.4 匿名類(lèi):匿名類(lèi)一定是一個(gè)內(nèi)部類(lèi),叫什么名字不用關(guān)心了
btnStep.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按下啦!");
step();
frame.repaint();
- 在new對(duì)象的時(shí)候給出的類(lèi)的定義形成了匿名類(lèi);
- 匿名類(lèi)可以繼承某類(lèi),也可以實(shí)現(xiàn)某接口;
- Swing的消息機(jī)制廣泛使用匿名類(lèi);
1.5 注入反轉(zhuǎn):
- 由按鈕公布一個(gè)收聽(tīng)者接口和一對(duì)注冊(cè)/注銷(xiāo)函數(shù);
- 你的代碼實(shí)現(xiàn)那個(gè)接口,將收聽(tīng)者對(duì)象注冊(cè)在按鈕上;
- 一旦按鈕被按下,就會(huì)反過(guò)來(lái)調(diào)用你的收聽(tīng)者對(duì)象的某個(gè)函數(shù);
2、MVC設(shè)計(jì)模式:
2.1 JTABLE(數(shù)據(jù)和表現(xiàn)是分離的):
- 用JTable類(lèi)可以以表格的形式顯示和編輯數(shù)據(jù)。JTable類(lèi)的對(duì)象并不存儲(chǔ)數(shù)據(jù),它只是數(shù)據(jù)的表現(xiàn),data.
package kcb;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class KCBData implements TableModel {
private String[]title = {
"周一","周二","周三","周四","周五","周六","周日"
};
private String[][] data = new String[8][7];
public KCBData() {
for(int i=0;i<data.length;i++) {
for(int j=01;j<data[i].length;j++) {
data[i][j] = " ";
}
}
}
@Override
public int getRowCount() {
return 8;
}
@Override
public int getColumnCount() {
return 7;
}
@Override
public String getColumnName(int arg0) {
return title[arg0];
}
@Override
public Class<?> getColumnClass(int arg0) {
return String.class;
}
@Override
public boolean isCellEditable(int arg0, int arg1) {
return true;
}
@Override
public Object getValueAt(int arg0, int arg1) {
return data[arg0][arg1];
}
@Override
public void setValueAt(Object arg0, int arg1, int arg2) {
data[arg1][arg2] = (String)arg0;
}
@Override
public void addTableModelListener(TableModelListener l) {
// TODO Auto-generated method stub
}
@Override
public void removeTableModelListener(TableModelListener arg0) {
// TODO Auto-generated method stub
}
}
package kcb;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class KCB {
public static void main(String[] args) {
JFrame frame = new JFrame();
JTable table = new JTable(new KCBData());
JScrollPane pane = new JScrollPane(table);//實(shí)現(xiàn)滾卷
frame.add(pane);//容器中增加一個(gè)表格
frame.pack();//frame是個(gè)容器
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

image.png
2.2 MVC設(shè)計(jì)模式:

image.png
- JTable只管表現(xiàn)不管數(shù)據(jù);
- MVC:
- 數(shù)據(jù)、表現(xiàn)和控制三者分離,各負(fù)其責(zé);
- M=Model(模型);
- V=View(表現(xiàn));
- C=Control(控制);
- 模型:保存和維護(hù)數(shù)據(jù),提供接口讓外部修改數(shù)據(jù),通知表現(xiàn)需要刷新;
- 表現(xiàn):從模型獲得數(shù)據(jù),根據(jù)數(shù)據(jù)畫(huà)出表現(xiàn);
- 控制:從用戶得到輸入,根據(jù)輸入調(diào)整數(shù)據(jù);
- 數(shù)據(jù)、表現(xiàn)和控制三者分離,各負(fù)其責(zé);