0

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

所以我的想法是每次都使用 aMouseListener检查行和列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));
}
4

2 回答 2

3

我不确定您的代码为什么不起作用(自从我完成 Swing 以来已经有一段时间了),但是您为什么不直接覆盖

public TableCellEditor getCellEditor(int row, int column)

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

于 2009-01-19T16:34:12.187 回答
1

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

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

于 2009-01-19T16:32:33.750 回答