我这周才开始学用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的好的书籍,能讲清楚原理的书。
谢谢。

解决方案 »

  1.   

    楼主1,2点的理解没错。
    书的话,初学使用Swing可以参考《JFC Swing标准教材》。网上也有专门讨论Swing里的Model的帖子。
      

  2.   

    1、我不知道能不能这样理解他们的关系:AbstractTableModel是数据的模型,是存放数据的容器,但是要显示数据,必须要和JTable相绑定,通过JTable来显示。也就是说,每个JTable的实例都必须配有一个TableModel,没有TableModel的JTable是不存在的,因为没有地方存放数据了;差不多,你就有其他方式加进去,也会有个默认的TableModel2、对于存取数据的方法:getValueAt和setValueAt,JTable和AbstractTableModel(或者 DefaultTableModel)都已经提供,那么这些方法在JTable和AbstractTableModel中有什么区别吗?我取数据看起来用两者都可以啊。可以这样理解否:JTable的getValueAt实际上最终还是调用了它所包含的AbstractTableModel的 getValueAt?
    这个没注意过,我一般调用TBModel3.看下Swing Hack 你会有收获的,简单的就他本身的例子吧,不过也不是特别简单
      

  3.   


    接口 TableModel
    所有已知实现类: 
    AbstractTableModel, DefaultTableModel
    真正用的是TableModel
    我的理解是JTable这个类包含了 TableModel这个属性,
    看了下源码也是如此
     
    /** The <code>TableModel</code> of the table. */
        protected TableModel        dataModel;set get你可以想成JAVABEAN
      

  4.   

    有一个比较好的网址呵呵看一下估计能明白了啊
    http://adorechen.blog.163.com/blog/static/3889027220071112112942184/
      

  5.   

    1.table不能单独存在,肯定要有数据模型,有些时候,树也是一样,即使你不设置model,也有默认的model2.public void setValueAt(Object aValue, int row, int column) {
            getModel().setValueAt(aValue, convertRowIndexToModel(row),
                                  convertColumnIndexToModel(column));
        }
    上面是jtable得setValueAt方法的源代码,可以看出,table只是调用了model的方法3.这个不好说,书倒是不少,不过找适合自己的不容易,有本清华出的Java Swing,挺全的,不过就是太厚了,1000多页...
      

  6.   

    再给你贴点源代码
    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();
        }