【问题标题】:Editable JComboBox KeyPressed not working可编辑的 JComboBox KeyPressed 不起作用
【发布时间】:2015-06-14 07:11:47
【问题描述】:


我有这段代码,我设计了一个editable JComboBox 来监听我的keyPressed 事件并显示按下该键的消息。但我不知道为什么这不起作用。 作为一个初学者,我可能在逻辑/概念上出错了。

所以,我会请求有关如何构建代码的建议,以便它工作。

代码

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 通常是一个糟糕的选择,但在您的情况下,KeyEvents 不会发送到 JComboBox,而是发送到充当编辑器的组件JComboBox。你想达到什么目的?
  • 我只是想在Editable JComboBox内按下任意键时收到一条消息
  • 我会“建议”一个 DocumentListener,混合一个 Swing Timer 和一个 SwingWorker,你不想在每次击键时都跑到数据库中,你需要允许用户停止输入,for example
  • 是的,为此我不想重新发明轮子:)。我想过使用 SwingX AutoCompleteDecorator.decorate(jcbx)
  • 坚持一周左右,你会看到这样的问题被问了大约 2-3 次,并不总是准确,但接近它。此外,我们错过了您的问题的上下文“我有这个代码,它不工作”并不能真正帮助我们帮助你,只是说;) - 哦,如果我投反对票,你会知道是我;) ,因为在我求助之前,我会花一些时间鼓励您改进您的问题/答案;)

标签: java swing jcombobox


【解决方案1】:

您不应该将 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();
   }
}

【讨论】:

  • 虽然这是正确的并且我对此没有任何问题,但如果 OP 尝试以某种方式修改该字段,则会导致突变异常。我“怀疑”他们正在尝试创建一个自动完成字段,但我不知道:P
  • @MadProgrammer:当然是真的。我假设他只是在寻找通知而不是突变。要进行变异,他可以使用 DocumentFilter,或者他可以作弊,使用 DocumentListener,将变异代码放在 Runnable 中并将其排队到事件线程中。
  • 正如我所说,我没有任何证据:P
  • 我不知道如何使用 Document 组件。真的很感激。投票赞成
猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2014-12-10
  • 1970-01-01
  • 2018-09-02
  • 2018-10-06
相关资源
最近更新 更多