如何将一个鼠标监听器添加到JTable的单元格中,该单元格保存一个呈现为复选框的布尔值

时间:2011-06-07 19:10:38

标签: java swing jtable mouselistener jcheckbox

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

public abstract class AbstractTable extends AbstractTableModel{

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

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

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

编辑:

@jzd回答是正确的。我可以在setValue方法中捕获更改。但我想知道如何实现基于鼠标监听器的方法。

4 个答案:

答案 0 :(得分:6)

  

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

在此example个可选值中,除了更新内部数据结构并触发相应的事件之外,不会覆盖setValue()方法ValueEditor扩展AbstractCellEditor并实施ItemListener,而ValueRenderer扩展JCheckBox。通过这种方式,编辑器可以在编辑器的JCheckBox内收听渲染器的itemStateChanged()

附录:添加CellEditorListener是另一种方法,JTree显示为here。请注意,JTable本身是CellEditorListener

答案 1 :(得分:5)

我无法抗拒@jzd的建议真的没有,我认为不是,不能确保我经历TableMode#setValue

但基本上有两个选项

1)TableModelListener

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); 
    //... 
 }

答案 2 :(得分:3)

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

如果你不能改变setValue()方法,那么下一个最好的东西就是CustomEditor会阻止更改,因为这不是捕获和隐藏鼠标点击的好方法,即使是默认布尔编辑器。

答案 3 :(得分:0)

我遇到了完全相同的问题,而且我也知道你专门要求一个鼠标监听器进入复选框编辑器,但是一个workarround可能会添加一个TableModelListener,如here所述“侦听数据更改”,并尝试在检测到更改时模拟行为,但是如果您想知道鼠标何时位于复选框或类似的内容上?鼠标的特定动作&gt;,我很害怕你必须让你自己实现一个单元格编辑器,它实现了那些行为...至少那就是我要做的......

素不相识!...