如何知道可编辑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: } });