java – 使JTable单元不可编辑

用户双击时,我试图使JTable的所有单元格都不可编辑.我已经阅读了很多论坛帖子,一般的共识是创建一个新的表模型类,扩展DefaultTableModel然后重写方法isCellEditable(int row,int column).我做了所有这些,现在当我运行我的程序(小程序)时,没有任何东西出现在单元格中.注意我这个学期有一个教授不认为applet已经过时了…

表模型的代码

public class MyTableModel extends DefaultTableModel
{
    public boolean isCellEditable(int row,int column)      //override isCellEditable
    //PRE:  row > 0,column > 0
    //POST: FCTVAL == false always
    {
        return false;
    }
}

    Code in my class:  **NOTE** this class extends JPanel 

    private JScrollPane storesPane;                
    private JTable storesTable; 

    Code in the Constructor:             

    storesTable = new JTable(tableData,COL_NAMES);    //tableData and COL_NAMES are passed in
    storesTable.setModel(new MyTableModel());

    storesPane = new JScrollPane(storesTable);
    storesTable.setFillsViewportHeight(true);
    add(storesPane,BorderLayout.CENTER);

希望你们中的一些Java大师可以找到我的错误:)

解决方法

这一行创建了一个新的JTable并在后台隐式创建了一个DefaultTableModel,它保存了JTable所需的所有正确数据:

storesTable = new JTable(tableData,COL_NAMES);

这一行有效地删除了上面隐式创建的表模型,该表模型保存了所有表的数据,并将其替换为不包含任何数据的表模型:

storesTable.setModel(new MyTableModel());

您需要为MyTableModel类提供构造函数,并在该构造函数调用超级构造函数,并将当前传递给其构造函数中的表的数据传入.

例如.,

public class MyTableModel extends DefaultTableModel {

   public MyTableModel(Object[][] tableData,Object[] colNames) {
      super(tableData,colNames);
   }

   public boolean isCellEditable(int row,int column) {
      return false;
   }
}

然后你可以像这样使用它:

MyTableModel model = new MyTableModel(tableData,COL_NAMES);
storesTable = new JTable(model);

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...