Java 可编辑的 JCombobox,用于监听 Enter 键事件

6

我有一个可编辑的JCombobox,并为组合框编辑器组件添加了键监听器。

当用户按下“Enter”键,如果可编辑组合框中没有文本,则需要使用JOptionPane显示消息框。我已经在keyrelease事件中完成了必要的代码,并且它可以按预期显示消息。

问题是,当我们得到消息框并且用户按下JOptionPane上的“确定”按钮时,组合框编辑器keyevent会再次触发。因此,当用户在消息框上按下Enter键时,JOptionPane会持续显示。

有什么解决方法吗?

请注意,我无法使用Action listener来解决这个问题。


1
请编辑您的问题,包括一个 sscce,展示您目前的解决方法。 - trashgod
6个回答

16

请检查这段代码是否有帮助!!!

JFrame frame = new JFrame("Welcome!!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JComboBox cmb = new JComboBox();
cmb.setEditable(true);
cmb.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {

    @Override
    public void keyReleased(KeyEvent event) {
        if (event.getKeyChar() == KeyEvent.VK_ENTER) {
            if (((JTextComponent) ((JComboBox) ((Component) event
                    .getSource()).getParent()).getEditor()
                    .getEditorComponent()).getText().isEmpty())
                System.out.println("please dont make me blank");
        }
    }
});
frame.add(cmb);

frame.setLocationRelativeTo(null);
frame.setSize(300, 50);
frame.setVisible(true);

由于这种投射方式,大多数人发现它很困难。


2
如果中间加入一些变量,理解起来会更容易。特别是在所有的强制类型转换中。 - Martin
在事件监听器中编写((JTextComponent) cmb.getEditor().getEditorComponent()).getText().isEmpty()会增加一些可读性,不管怎样,这是一个好的解决方案,帮了我很多! - Benas

4
我们需要在下拉框所使用的组件上添加一个键盘监听器,以便进行编辑服务。
JTextComponent editor = (JTextComponent) urCombo.getEditor().getEditorComponent();
editor.addKeyListener(new KeyAdapter() {
   public void keyReleased(KeyEvent evt) {
      // your code
   }
});

希望这段代码有所帮助。

1
Note that I can't use Action listener for this.

这对我来说毫无意义,那么使用ItemListener

Any idea how to solve this?
  • 永远不要在Swing JComponents中使用KeyListener,而应该使用(请注意我不能为此使用Action listenerKeyBindings

  • 注意API默认实现了JComboBoxENTER键,必须从按下ENTER键覆盖此操作。


0

一个选项是用你自己的接口替换KeySelectionManager接口。你想要替换JComboBox.KeySelectionManager,因为它负责将输入的字符转换为应该被选择的行号(作为int类型)。


0
请通过 ev.getkeycode() 检查事件的 ASCII 码,并检查它是数字还是字符。 如果既不是数字也不是字符,则不执行任何操作。如果符合要求,则进行处理。

0
如果您正在使用Netbeans,则右键单击组合框并选择自定义代码。 添加以下代码行。
JTextComponent editor = (JTextComponent) Code.getEditor().getEditorComponent();
editor.addKeyListener(new KeyAdapter() {
   public void keyReleased(KeyEvent evt) {
        if(evt.getKeyCode()==10)
            //do your coding here.
   }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接