如何知道可编辑JComboBox的文本何时更改?

Law*_*Dol 18 java swing jcombobox

我有一个可编辑的 JComboBox,我希望在文本更改时通过键入或选择来执行某些操作.在这种情况下,文本是一种模式,我想验证模式是否有效并显示导致某些测试数据的匹配.

完成了显而易见的事情,附上了一个ActionHandler,我发现,对于打字,事件似乎不可靠,最好(选择很好).而当它火打字的结果,文字检索(使用getEditor().getItem()时,因为getSelectedItem()只得到,当它被从列表中选择文本)似乎是文本,因为它是当最后一个事件被触发 - 也就是说,它始终缺少在触发动作事件之前立即输入的字符.

我预计动作事件会在一段短暂的延迟(500毫秒到1秒)后触发,但它似乎会在键入时立即触发(如果它被触发).

我能想到的唯一可行的替代方案是简单地在焦点获得时启动1秒计时器,在焦点丢失时将其杀死,并在内容与上次不同时执行计时器操作.

有什么想法或建议吗?

代码片段不是特别有趣:

find.addActionListener(this);
...
public void actionPerformed(ActionEvent evt) {
    System.out.println("Find: "+find.getEditor().getItem());
    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*Ray 31

动作侦听器通常仅在您按Enter键时触发,或者将焦点从组合框的编辑器移开.截取编辑器的个别更改的正确方法是注册文档侦听器:

final JTextComponent tc = (JTextComponent) combo.getEditor().getEditorComponent();
tc.getDocument().addDocumentListener(this);
Run Code Online (Sandbox Code Playgroud)

所述的DocumentListener接口具有每当文档衬板编辑器被修改(中的insertUpdate,中的removeUpdate,changeUpdate)被调用的方法.

您还可以使用匿名类来更精细地控制事件的来源:

final JTextComponent tcA = (JTextComponent) comboA.getEditor().getEditorComponent();
tcA.getDocument().addDocumentListener(new DocumentListener() { 
  ... code that uses comboA ...
});

final JTextComponent tcB = (JTextComponent) comboB.getEditor().getEditorComponent();
tcB.getDocument().addDocumentListener(new DocumentListener() { 
  ... code that uses comboB ...
});
Run Code Online (Sandbox Code Playgroud)