2009-02-18 97 views
8

我遇到以下代码的问题,我在其中使用JComboBox更改表格单元格中的字符串值。 JComboBox的工作正常,但如果我点击框中,然后点击而不选择任何东西 JComboBox的下拉列表仍然可见,即使我删除该行。单击另一个Swing组件(如JButton)通常会导致它消失,但并非总是如此。焦点问题使用JComboBox作为JTable中的单元格编辑器


    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组件不会导致框消失。有了它,点击任何需要关注的东西都会使盒子消失,使问题变得更加烦人,但可能掩盖了行为的原因。

我在这里做错了什么,或忘记了一步?或者,是否有办法迫使它关闭?

谢谢!

回答

11

要理解这一点,您需要了解可编辑表格的含义。一点理论:

每个单元格都有一个潜在的渲染器和编辑器。渲染器只是告诉单元格如何绘制,而不与事件交互。然而编辑器是一个可以与事件交互的组件。当触发编辑的事件发生时,编辑器组件将添加到表格顶部。编辑完成后,组件被删除。

为了让组件消失,您必须确保单元格不处于“编辑”状态。这就是为什么terminateEditOnFocusLast导致JComboBox消失的原因。如果你想要其他的东西让盒子去,你可能需要调用removeEditor()来响应某些事件,可能是焦点或者单元格选择。

为了真正了解发生了什么,我建议快速查看removeEditor(),editCellAt()等源代码,并且可能在调试器中单步执行一次。有可能你重写了一些事件处理代码,或者在你不应该的时候调用它。 JTable中的编辑器/事件处理代码相当脆弱,偶然发生的调用以错误的顺序发生并带有有趣的副作用是非常容易的。另外,Java在版本之间非常巧妙地改变了JTable的事件和焦点行为,我认为它在1.4和1.5之间,当swing的焦点处理发生改变时。所以我建议尝试的第一件事是你的代码使用不同的Java版本。这个错误可能是由Sun引起的(我们需要更改一些复杂的编辑器代码),如果发布版本不同,则更容易向Sun报告。

+0

谢谢你的背景和完整的答案。我已经看过这些方法,但还没有发现任何东西。我认为你基本上得到了正确的答案 - 我只需要弄清楚它发生了什么。谢谢! – 2009-02-19 20:14:36

1

我知道这个问题很旧,但仅供参考,这里是我的解决方案。我扩展DefaultCellEditor并监听JComboBox被取消,然后强制编辑器取消。

import javax.swing.DefaultCellEditor; 
import javax.swing.JComboBox; 
import javax.swing.event.PopupMenuEvent; 
import javax.swing.event.PopupMenuListener; 

public class ComboBoxCellEditor extends DefaultCellEditor { 

    public ComboBoxCellEditor(JComboBox comboBox) { 
     super(comboBox); 
     comboBox.addPopupMenuListener(new PopupMenuListener() { 

      public void popupMenuWillBecomeVisible(PopupMenuEvent e) { 
      } 

      public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
      } 

      public void popupMenuCanceled(PopupMenuEvent e) { 
       cancelCellEditing(); 
      } 
     }); 
    } 
} 

则...

DefaultCellEditor editor = new ComboBoxCellEditor(combobox); 
column.setCellEditor(editor); 
相关问题