刷新JTable的setCellEditor

时间:2009-01-19 16:05:25

标签: java swing jtable

我正在寻找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));
}

2 个答案:

答案 0 :(得分:3)

我不确定为什么你的代码不能正常工作(自从我完成Swing以来已经有一段时间了),但为什么不重写

public TableCellEditor getCellEditor(int row, int column)

在您的JTable上?维护要用于每行的组合框的映射,并在overriden方法中返回正确的组合框。

答案 1 :(得分:1)

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

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