我遇到以下代码的问题,我使用JComboBox更改表格单元格中的字符串值.JComboBox工作正常,但是如果我在框中单击然后单击而不选择任何内容,即使我删除了行,JComboBox的下拉列表仍然可见.单击另一个像JButton这样的Swing组件通常会导致它消失,但并非总是如此.
TableColumn col = myTable.getColumnModel().getColumn(0); JComboBox eq = new JComboBox(); eq.addItem("=="); eq.addItem("!="); DefaultCellEditor editor = new DefaultCellEditor(eq); col.setCellEditor(editor);
编辑:我之前忽略了提到:
myTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
如果我对此行进行注释或将其设置为false,则单击其他Swing组件不会导致该框消失.有了它,点击任何需要聚焦的东西会使盒子消失,使问题不那么烦人,但可能掩盖了行为的原因.
我在这里做错了什么,还是忘记了一步?或者,有没有办法迫使它自己关闭?
谢谢!
要理解这一点,您需要了解可编辑表格的内容.一点点理论:
每个单元格都有一个潜在的渲染器和编辑器.渲染器只是告诉单元格如何绘制并且不与事件交互.然而,编辑器是可以与事件交互的组件.当发生触发编辑的事件时,编辑器组件将添加到表的顶部.编辑完成后,组件将被删除.
为了使组件消失,您必须确保单元格仍处于"编辑"状态.这就是terminateEditOnFocusLast导致JComboBox消失的原因.如果你想让其他东西进入,你可能需要调用removeEditor()来响应某些事件,可能是焦点或单元格选择.
要真正了解发生的情况,我建议您快速查看removeEditor(),editCellAt()等源代码,并在调试器中单步执行一次.您可能已经覆盖了一些事件处理代码,或者在您不应该调用它时调用它.JTable中的编辑器/事件处理代码相当脆弱,并且通过有趣的副作用以错误的顺序进行调用很容易.
此外,Java在版本之间非常巧妙地改变了JTable的事件和焦点行为一次,我认为它在1.4和1.5之间,当时swing的焦点处理发生了变化.所以我建议尝试的第一件事是你的代码与不同的Java版本.该错误可能是由Sun引起的(我们的一些复杂的编辑器代码必须更改),如果它在版本之间有所不同,则向Sun报告更容易.