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

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

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

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

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

有什么想法或建议吗?

代码片段不是特别有趣:

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

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

 final JTextComponent tc = (JTextComponent) combo.getEditor().getEditorComponent(); tc.getDocument().addDocumentListener(this); 

DocumentListener接口具有在修改支持编辑器的Document时调用的方法(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 ... }); 

你可以使用这样的东西:

 JComboBox cbListText = new JComboBox(); cbListText.addItem("1"); cbListText.addItem("2"); cbListText.setEditable(true); final JTextField tfListText = (JTextField) cbListText.getEditor().getEditorComponent(); tfListText.addCaretListener(new CaretListener() { private String lastText; @Override public void caretUpdate(CaretEvent e) { String text = tfListText.getText(); if (!text.equals(lastText)) { lastText = text; // HERE YOU CAN WRITE YOUR CODE } } }); 

这听起来像是最好的解决方案

 jComboBox.getEditor().getEditorComponent().addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { //add your hadling code here: } });