我正在寻找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));
}
答案 0 :(得分:3)
我不确定为什么你的代码不能正常工作(自从我完成Swing以来已经有一段时间了),但为什么不重写
public TableCellEditor getCellEditor(int row, int column)
在您的JTable上?维护要用于每行的组合框的映射,并在overriden方法中返回正确的组合框。
答案 1 :(得分:1)
我的理论是,当调用注册到Table / TableCell的所有鼠标侦听器时,默认情况下将首先在鼠标侦听器之前调用安装到API类的鼠标侦听器。这意味着在将其设置为另一个之前,将发生导致编辑器被提取的事件。有点像竞争条件,只是它实际上是在API源代码中的某个地方定义的......这是我的天真理论,我已经可以看到它的一些漏洞,所以我的解决方案:
覆盖JTable.getCellEditor(int row, int col)。这允许您为任何单元格返回所需的编辑器。