【问题标题】:refresh setCellEditor for JTable刷新 JTable 的 setCellEditor
【发布时间】:2009-01-19 16:05:25
【问题描述】:

我正在寻找previous question 的答案,并且有一个巧妙的想法来克服JTable 的限制。我需要编辑器逐行不同,而JTable 只能为每一列处理一个编辑器。

所以我的想法是使用MouseListener 来检查JTable 上的行和列,并每次设置新的编辑器。

但是,第二次调用setCellEditor() 没有任何效果。编辑器仍然是第一个设置的。那么如何让“setCellEditor”为同一列再次工作?

这是MouseListener中的代码。

public void mouseClicked(MouseEvent e) {
    int cols = resultTable.columnAtPoint(new Point(e.getX(), e.getY()));
    int rows = resultTable.rowAtPoint(new Point(e.getX(), e.getY()));
    StorageObject item = (StorageObject) resultTable.getModel().getValueAt(rows, cols);
    TableColumn col = resultTable.getColumnModel().getColumn(cols);
    col.setCellEditor(new MyComboBoxEditor(item.list));
}

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    我不确定你的代码为什么不起作用(我已经有一段时间没有完成 Swing),但你为什么不直接覆盖

    public TableCellEditor getCellEditor(int row, int column)
    

    在您的 JTable 上?维护您要为每一行使用的组合框的映射,并在您的覆盖方法中返回正确的组合框。

    【讨论】:

    • 是的。这就是您为单个列处理多种编辑器类型的方式。
    【解决方案2】:

    我的理论是,当所有注册到 Table/TableCell 的鼠标侦听器都被调用时,默认安装到 API 类的那些将在您的鼠标侦听器之前被首先调用。这意味着导致获取编辑器的事件将在您将其设置为其他事件之前发生。有点像竞态条件,只是它实际上是在 API 源代码中的某个地方定义的......这是我的幼稚理论,我已经可以看到其中的一些漏洞,等等我的解决方案:

    覆盖JTable.getCellEditor(int row, int col)。这允许您为任何单元格返回您想要的任何编辑器。

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2015-09-06
      • 2011-12-05
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      相关资源
      最近更新 更多