2011-11-17 28 views
1

我在Java中编写Swing代码。我正在使用Netbeans布局管理器。我遇到了jTable的问题。我已经应用了一个扩展了AbstractTableModel的客户模型。我希望第三列以复选框的形式包含布尔值(我已成功完成)。我有JTable的对话框实现了TableModelListener。我的tableChanged()方法只有下面的代码:System.out.println("Table changed!"); 但是,每当我尝试检查其中一个复选框时,它会执行一点“抑制”操作,当我单击并按住时,那么当我释放时,它不会更改复选框的状态。它也不打印出“表格已经改变!”这一直让我疯狂。我已阅读所有关于它的内容,但无法弄清楚为什么我的工作不正常。请帮忙。下面是相关的代码:swing tableChanged()不响应表更改

在JDialog的构造:

this.chapterTableModel = new ChapterTableModel(chapterList); 
chapterTableModel.addTableModelListener(this); 

再一个方法,做到这一点:chapterTable.setModel(chapterTableModel);

然后我下面的构造,我有这样的方法:

@Override 
public void tableChanged(TableModelEvent tme) { 
    System.out.println("Table Changed!"); 
} 

整个代码可以在这里找到:http://collabedit.com/ttcds 和这里:http://collabedit.com/qn3kx

感谢您的帮助!

+2

发布您的[SSCCE](http://www.sscce.org),演示该问题。并从DefaultTableModel开始,而不是您自定义的TableModel来帮助缩小问题的范围。 – camickr

+0

感谢您的提示。我不确定如何更好地实施SSCCE标准。我正在切换到DefaultTableModel。它现在正在触发tableChanged()方法,但现在我很难将第三列设置为布尔值复选框,而不是使用“false”或“true”字符串 – kentcdodds

+0

要显示复选框,请覆盖JTable的getColumnClass()方法或DefaultTableModel为列返回Boolean.class,表格将选择适当的渲染器和编辑器。 – camickr

回答

2

您不是在任何地方压倒setValueAt,所以表中的值不会被更改。

+0

但是应该防止它甚至打印出“Table changed!”? – kentcdodds

+0

甜!这工作!我想这是有道理的。我仍然不明白为什么tableChanged()当我点击它们时没有去,但它现在正在工作。万分感谢! – kentcdodds

+0

@kentd是的,表中的值永远不会改变,所以侦听器永远不会被触发。覆盖setValueAt并让它更新被忽略的标志并激发一个table changed事件。 – Jim

3

你是否正在调用ChapterTableModel的mutators中的父类AbstractTableModel类的一个fire-methods?

+0

是的,在ChapterTableModel: '公共无效fireTable(){'' this.fireTableDataChanged();'' }' – kentcdodds

+1

如果你更新通过编辑单元格,你必须重写setValueAt法表模型,在那里你更新您的数据,然后调用fireTableCellUpdated:http://download.oracle.com/javase/tutorial/uiswing/components/table.html – Puce

+0

非常感谢!就是这样。所以tableChanged()方法不是必需的?这是否意味着我不需要在持有jTable的jDialog中实现TableModelListener?再次感谢您的帮助! – kentcdodds