有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何知道可编辑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) 个答案

  1. # 1 楼答案

    这听起来是最好的解决办法

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

    动作侦听器通常仅在按下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 ...
    });
    
  3. # 3 楼答案

    你可以使用这样的东西:

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