【问题标题】:how to add a mouse listener to a JTable's cell holding a Boolean value rendered as checkbox如何将鼠标侦听器添加到 JTable 的单元格中,该单元格包含呈现为复选框的布尔值
【发布时间】:2011-09-10 08:26:38
【问题描述】:

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

public abstract class AbstractTable extends AbstractTableModel{

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

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

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

编辑:

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

【问题讨论】:

    标签: java swing jtable mouselistener jcheckbox


    【解决方案1】:

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

    在这个可选值的example 中,setValue() 方法没有被覆盖,除了更新内部数据结构并触发适当的事件ValueEditor 扩展 AbstractCellEditor 并实现 ItemListener,而 ValueRenderer 扩展 JCheckBox。这样编辑器就可以在编辑器的itemStateChanged()里面监听渲染器的JCheckBox

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

    【讨论】:

    • +1... 这应该是本周第 10 篇对 Swing 帮助很大的垃圾神帖子!
    • @The111:很高兴为您提供帮助;我已经更新了答案以澄清 editingupdating 之间的区别。
    • 在第一个示例中,创建两个 ValueRenderer 实例的原因是什么?
    • 一个用作单元格渲染器;另一个为单元格编辑器服务。
    【解决方案2】:

    我无法抗拒@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); 
        //... 
     }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 是的,我可以。无论如何,我想知道它是否也可能以及如何通过鼠标侦听器来实现。从现在开始我就是这样做的。我的表模型类有点复杂。我想使用鼠标侦听器来避免我想对状态更改执行的操作,而不是表模型本身。特别是我想避免将逻辑放在 setValue 中。还是谢谢
      • +1 自定义编辑器和渲染器是正确的方法。我已经描述了一个例子here
      【解决方案4】:

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

      您好!...

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 2013-12-17
        • 2015-12-24
        • 2012-09-04
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        相关资源
        最近更新 更多