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

时间:2009-08-10 00:40:39

标签: 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());
    }

3 个答案:

答案 0 :(得分:31)

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

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

每当修改支持编辑器的文档时,DocumentListener interface都会调用方法(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 ...
});

答案 1 :(得分:-1)

您可以使用以下内容:

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
        }
    }
});

答案 2 :(得分:-1)

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

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

}    });