可编辑的 JComboBox KeyPressed 不工作

Editable JComboBox KeyPressed not working


我有这段代码,我在其中设计了一个 editable JComboBox 来监听我的 keyPressed 事件并显示一条消息,表明按键已按下。但我不知道为什么这不起作用。 作为一个初学者,我可能犯了错误logically/conceptually。

因此,我会征求有关如何构建代码的建议,以使其有效。

代码

import javax.swing.*;
import java.awt.*;

public class testEJCBX extends JFrame {
    JComboBox jcbx = new JComboBox();

    public testEJCBX() {
        super("Editable JComboBox");
        jcbx.setEditable(true);

        getContentPane().setLayout(new FlowLayout());
        getContentPane().add(jcbx);

        jcbx.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) 
            {
                jcbxKeyPressed(evt);
            }
        });

        setSize(300, 170);
        setVisible(true);
    }
    private void jcbxKeyPressed(java.awt.event.KeyEvent evt) {                                      
       JOptionPane.showMessageDialog(null, "Key Pressed");
    }

    public static void main(String argv[]) {
        new testEJCBX();
    }
}

您不应该为这类事情使用 KeyListener。相反,如果您想检测组合框编辑器组件的更改,请提取它并向其添加一个 DocumentListener:

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import java.awt.*;

public class TestEJCBX extends JFrame {
   JComboBox<String> jcbx = new JComboBox<>();

   public TestEJCBX() {
      super("Editable JComboBox");
      setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      jcbx.setEditable(true);

      getContentPane().setLayout(new FlowLayout());
      getContentPane().add(jcbx);

      JTextField editorComponent = (JTextField) jcbx.getEditor()
            .getEditorComponent();

      Document doc = editorComponent.getDocument();
      doc.addDocumentListener(new DocumentListener() {

         @Override
         public void removeUpdate(DocumentEvent e) {
            System.out.println("text changed");
         }

         @Override
         public void insertUpdate(DocumentEvent e) {
            System.out.println("text changed");
         }

         @Override
         public void changedUpdate(DocumentEvent e) {
            System.out.println("text changed");
         }
      });

      pack();
      setLocationRelativeTo(null);
      setVisible(true);
   }

   public static void main(String argv[]) {
      new TestEJCBX();
   }
}