mvc设计模式:数据、表现和控制三者分离,各负其责。
M:Model(模型) V:View(表现) C:Control(控制)
控制:通过模型提供的接口从用户得到输入(用鼠标、键盘在这个表格里进行的动作),根据输入调整数据(模型)
模型:保存和维护数据,提供接口让外部修改数据,通知表现需要刷新。
表现:当被通知数据修改后,从模型获得数据,根据数据重画出表现(刷新)。
控制和表现是没有关系的,控制不直接和表现打交道,即用户在界面上做的操作,不直接去修改界面上的显示。而是用户的输入去调整内部的数据,内部的数据去触发表现,即表现把所有数据拿过去重画一遍。
这样做的好处是每一个部分都很单纯,尤其是View。
示例(一个课程表,可以添加、删除课程)如下:
JTable:表现+控制 这是mvc的常用做法
package kechengbiao;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class Kechengbiao {
public static void main(String [] args) {
//frame是个容器
JFrame frame = new JFrame();
//JTable可以以表格的形式显示和编辑数据。JTable这个类是表达你所看见的东西(表现),而不是整个表格,它不管数据,数据在JTableModel里。
//JTable的对象在构造时,给了它一个TableModel的对象,TableModel是个接口,这个接口是和JTable一起来的,因此JTable知道TableModel长什么样。
//我实现了一个TableModel的类的对象给JTable。在那个TableModel里,必须去Override它所要求的那么多的函数,这些函数是在JTable被显示的过程当中会被逐一调用的。
//调用过程就会回过来调我写的函数。
//所以我的数据是由我写的TableModel来维护,而JTable只管表现,不管数据。
JTable table = new JTable(new KCBData());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭机制,即点红叉叉可以关闭窗口
//table本身没有实现滚卷,就没有办法做所有内容的呈现,它只能呈现一部分内容
//把table放进panel,实现滚卷
JScrollPane panel = new JScrollPane(table);
frame.add(panel);
frame.setSize(400,400);
// frame.pack();//把自己的大小计算一下
frame.setVisible(true);
}
}
package kechengbiao;
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=0;j<data[i].length;j++) {
data[i][j]="";
}
}
}
@Override
public int getRowCount() {
// TODO Auto-generated method stub
return 8;
}
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return 7;
}
//得到列名
@Override
public String getColumnName(int arg0) {
// TODO Auto-generated method stub
//title是前面写好的放着周一周二周三...的数组
return title[arg0];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
// TODO Auto-generated method stub
return String.class;
}
//每个格子可以被编辑
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
return true;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
return data[rowIndex][columnIndex];
}
//arg0是对象
@Override
public void setValueAt(Object arg0, int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
data[rowIndex][columnIndex]=(String)arg0;
}
@Override
public void addTableModelListener(TableModelListener l) {
// TODO Auto-generated method stub
}
@Override
public void removeTableModelListener(TableModelListener l) {
// TODO Auto-generated method stub
}
}