我这周才开始学用Swing,根据例程自己写点代码,但是疑问多多。
关于JTable和AbstractTableModel(或者DefaultTableModel)的关系,我有三个疑问:
1、我不知道能不能这样理解他们的关系:AbstractTableModel是数据的模型,是存放数据的容器,但是要显示数据,必须要和JTable相绑定,通过JTable来显示。也就是说,每个JTable的实例都必须配有一个TableModel,没有TableModel的JTable是不存在的,因为没有地方存放数据了;
2、对于存取数据的方法:getValueAt和setValueAt,JTable和AbstractTableModel(或者DefaultTableModel)都已经提供,那么这些方法在JTable和AbstractTableModel中有什么区别吗?我取数据看起来用两者都可以啊。可以这样理解否:JTable的getValueAt实际上最终还是调用了它所包含的AbstractTableModel的getValueAt?
3、Swing的设计思想就是按照MVC来的吗?请推荐我一些Swing的好的书籍,能讲清楚原理的书。
谢谢。
关于JTable和AbstractTableModel(或者DefaultTableModel)的关系,我有三个疑问:
1、我不知道能不能这样理解他们的关系:AbstractTableModel是数据的模型,是存放数据的容器,但是要显示数据,必须要和JTable相绑定,通过JTable来显示。也就是说,每个JTable的实例都必须配有一个TableModel,没有TableModel的JTable是不存在的,因为没有地方存放数据了;
2、对于存取数据的方法:getValueAt和setValueAt,JTable和AbstractTableModel(或者DefaultTableModel)都已经提供,那么这些方法在JTable和AbstractTableModel中有什么区别吗?我取数据看起来用两者都可以啊。可以这样理解否:JTable的getValueAt实际上最终还是调用了它所包含的AbstractTableModel的getValueAt?
3、Swing的设计思想就是按照MVC来的吗?请推荐我一些Swing的好的书籍,能讲清楚原理的书。
谢谢。
书的话,初学使用Swing可以参考《JFC Swing标准教材》。网上也有专门讨论Swing里的Model的帖子。
这个没注意过,我一般调用TBModel3.看下Swing Hack 你会有收获的,简单的就他本身的例子吧,不过也不是特别简单
接口 TableModel
所有已知实现类:
AbstractTableModel, DefaultTableModel
真正用的是TableModel
我的理解是JTable这个类包含了 TableModel这个属性,
看了下源码也是如此
/** The <code>TableModel</code> of the table. */
protected TableModel dataModel;set get你可以想成JAVABEAN
http://adorechen.blog.163.com/blog/static/3889027220071112112942184/
getModel().setValueAt(aValue, convertRowIndexToModel(row),
convertColumnIndexToModel(column));
}
上面是jtable得setValueAt方法的源代码,可以看出,table只是调用了model的方法3.这个不好说,书倒是不少,不过找适合自己的不容易,有本清华出的Java Swing,挺全的,不过就是太厚了,1000多页...
JTable的构造方法,不带参数的
public JTable() {
this(null, null, null);//调用下面的构造方法,
} public JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) {
super();
setLayout(null); setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
JComponent.getManagingFocusForwardTraversalKeys());
setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS,
JComponent.getManagingFocusBackwardTraversalKeys());
if (cm == null) {
cm = createDefaultColumnModel();
autoCreateColumnsFromModel = true;
}
setColumnModel(cm); if (sm == null) {
sm = createDefaultSelectionModel();//默认构造model
}
setSelectionModel(sm); // Set the model last, that way if the autoCreatColumnsFromModel has
// been set above, we will automatically populate an empty columnModel
// with suitable columns for the new model.
if (dm == null) {
dm = createDefaultDataModel();
}
setModel(dm); initializeLocalVars();
updateUI();
}