2014-04-04 69 views
0

我有一个JFrame应用程序,它包含一个JTabel。底层表模型是我自己的类,我做了这个扩展AbstractTableModel。第一列中的数据是布尔类型的,所以我希望它以复选框的形式显示值。要做到这一点,我在我的表模型下面的代码添加的getColumnClass方法:检测单元格单击已选择表格行

@Override 
public Class<?> getColumnClass(int columnIndex) { 
    if (columnIndex == 0) { 
     return Boolean.class; 
    } else if (columnIndex == 1) { 
    .... 
    .... 
} 

这工作得很好,我的表格单元格看起来就像下面这正是我想要的:

JTable Checkbox Columns

我现在想要的行为是,当用户点击任何一行的第0列单元格时,我想要切换的销售价格

我的主类通过实现ListSelectionListener并重写的valueChanged方法监听表中选择。在valueChanged方法中,我可以通过调用table.getSelectedColumn并检查它是否为0,然后获取所选行的对象并切换销售值上的布尔值来检查所选列。

我遇到的问题是,如果一个特定的行已被选中并且用户点击的单元中第0列的所选行的的valueChanged方法不会被调用,因此我因此从未切换的值。

我的问题是,如何检测单元格选择/点击已选择的行?我应该使用鼠标选择侦听器,然后使用鼠标点击事件中的位置数据确定单击的单元格吗?

谢谢。

+0

获取所选的行,然后获取鼠标单击的行,列。比较两者。 – Amarnath

回答

0

您是否尝试过倾听表格变化?您将需要实现TableModelListener并拥有此项:

public void tableChanged(TableModelEvent e) { 
    int row = e.getFirstRow(); 
    int column = e.getColumn(); 
    TableModel model = (TableModel)e.getSource(); 
    String columnName = model.getColumnName(column); 
    Object data = model.getValueAt(row, column); 

    ...// Do something with the data... 
} 
+0

我没有想到,但表中没有任何变化,所以tableChanged何时会被调用? –

+0

如果您实现DefaultTableModel而不是AbstractTableModel,则只要在表模型(单元格,行,表结构)上更新了某个对象时,它就会自动触发tableChanged事件 – kaya