6

我有一个带有自定义模型的 JTable,它实现了扩展 AbstractTableModel。

public abstract class AbstractTable extends AbstractTableModel{

     public Class<? extends Object> getColumnClass(int c) {}
}

因为我已经实现了 getColumnClass 方法,所以布尔值会像复选框一样呈现在表格中。我想拦截复选框的状态更改,但不幸的是我无法直接添加鼠标侦听器,因为我没有对复选框本身的引用,它不是由我创建的。

如何设置鼠标侦听器来拦截复选框状态更改事件?

编辑:

@jzd 答案是正确的。我可以捕捉到 setValue 方法的变化。但我想知道如何实现基于鼠标侦听器的方法。

4

4 回答 4

6

特别是,我想避免将逻辑放入setValue().

在这个可选值的例子中,除了更新内部数据结构和触发适当的事件之外setValue(),该方法没有被覆盖。扩展和实现,而扩展。通过这种方式,编辑器可以在编辑器的.ValueEditorAbstractCellEditorItemListenerValueRendererJCheckBoxJCheckBoxitemStateChanged()

附录:添加 aCellEditorListener是另一种方法,此处显示JTree. 请注意,JTable它本身是一个CellEditorListener.

于 2011-06-08T00:34:45.437 回答
5

我无法抗拒@jzd 的建议,真的不,我认为不是,不能确保我通过TableMode#setValue

但基本上有两种选择

1) 表模型监听器

2) AFAIK 只有 TableCellEditor#isCellEditable 可以在与 JTable 中的 JCheckBox 或 JRadioButton 连接时做到这一点

public boolean isCellEditable(EventObject getEvent) {
    MouseEvent me = (MouseEvent) getEvent;
    JTable table = (JTable) (me.getSource());
    Point point = me.getPoint();
    int column = table.columnAtPoint(point);
    int row = table.rowAtPoint(point);
    Rectangle rec = table.getCellRect(row, column, true); 
    //... 
 }
于 2011-06-07T21:56:10.997 回答
3

似乎添加鼠标侦听器是一个额外的步骤。我建议拦截setValue()模型方法的变化。

如果您无法更改setValue()方法,那么下一个最好的方法是CustomEditor阻止更改,因为即使在默认的布尔编辑器中,这也不是捕捉和隐藏鼠标单击的好方法。

于 2011-06-07T19:14:28.400 回答
0

我遇到了完全相同的问题,而且我也知道您专门要求为复选框编辑器提供鼠标侦听器,但是解决方法可能会在“侦听数据更改”部分下添加一个 TableModelListener并尝试模拟检测到更改时的行为,但是如果您想知道鼠标何时在复选框上方或类似<鼠标的特定操作>之类的东西,我担心您必须自己实现单元格编辑器,它实现了这些行为......至少那是我会做的......

问候!...

于 2013-07-23T19:22:25.070 回答