JTable单元格值更改侦听器

时间:2011-09-30 00:55:45

标签: swing jtable listener

哪个侦听器可用于响应JTable单元格值更改的事件?我尝试使用TableModelListener但是我得到了一些错误,或者这个监听器没有对更改单元格内容做出反应。

我需要采取行动改变细胞内容或细胞失去焦点。做这个的最好方式是什么?感谢。

3 个答案:

答案 0 :(得分:5)

class extends JTable {

.... (内部构造函数)

addPropertyChangeListener(new PropertyChangeListener() {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if ("tableCellEditor".equals(evt.getPropertyName())) {
            if (isEditing())
                processEditingStarted();
            else
                processEditingStopped();
        }
    }
});

...(结束构造函数)

protected void processEditingStopped() {
    System.out.println("save " + editingRow + ":" + editingColumn);
}

protected void processEditingStarted() {
    System.out.println("edit " + editingRow + ":" + editingColumn);
    if (editRow > -1 && editColumn > -1)
        oldValue = (String) model.getValueAt(editRow, editColumn);
}

}

更多详细信息:http://tips4java.wordpress.com/2009/06/07/table-cell-listener/

答案 1 :(得分:2)

对价值变化做出反应的简便方法是自定义表格模型并对setValueAt()做出反应。

如果您想要在失去焦点时确保编辑“坚持”,请在表格中调用此方法。

table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 

答案 2 :(得分:0)

正如Bill所提到的,“监视”模型比JTable可能更容易,我使用它并能够按列和行跟踪更改:

list.getModel().addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
                System.out.println("Column: " + e.getColumn() + " Row: " + e.getFirstRow());
            }
        });

正如我在对他们的答案的评论中提到的那样,它不会检测到是否仅对单元格进行了编辑才发生更改。因此,您需要以某种方式检查原始值。但这省去了我的JTable构造函数。