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

Hei*_*bug 6 java swing jtable jcheckbox mouselistener

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

public abstract class AbstractTable extends AbstractTableModel{

     public Class<? extends Object> getColumnClass(int c) {}
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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

tra*_*god 6

特别是,我想避免把逻辑放在里面setValue().

在此可选值的示例setValue(),除非更新内部数据结构并触发相应的事件,否则不会覆盖该方法.ValueEditor扩展AbstractCellEditor和实现ItemListener,同时ValueRenderer扩展JCheckBox.通过这种方式,编辑器可以在编辑器中监听渲染JCheckBoxitemStateChanged().

附录:添加CellEditorListener是另一种方法,显示在这里JTree.请注意,JTable它本身就是一个CellEditorListener.


mKo*_*bel 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); 
    //... 
 }
Run Code Online (Sandbox Code Playgroud)