用于 Enter 键的 Java 可编辑 JCombobox Keylistener 事件

Posted

技术标签:

【中文标题】用于 Enter 键的 Java 可编辑 JCombobox Keylistener 事件【英文标题】:Java Editable JCombobox Keylistener event for Enter key 【发布时间】:2012-12-12 22:32:23 【问题描述】:

我有可编辑的 JCombobox,并为组合框编辑器组件添加了 keylistener。 当用户按下“Enter 键”并且可编辑组合框上没有文本时,我需要使用 JOptinoPane 显示消息框。我在 keyrelease 事件中完成了必要的代码,它按预期显示消息。

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

知道如何解决这个问题吗?

请注意,我不能为此使用 Action 侦听器。

【问题讨论】:

请编辑您的问题以包含一个sscce,以显示您当前的方法。 【参考方案1】:

请检查此代码是否对您有帮助!!!

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

大多数人都因为这个选角而感到困难。

【讨论】:

中间加几个变量会更容易理解。尤其是所有的演员。 在事件监听器中写((JTextComponent) cmb.getEditor().getEditorComponent()).getText().isEmpty()会增加一些可读性,无论如何,很好的解决方案,对我帮助很大!【参考方案2】:

我们需要在组合框用来服务编辑的组件上添加一个键监听器。

JTextComponent editor = (JTextComponent) urCombo.getEditor().getEditorComponent();
editor.addKeyListener(new KeyAdapter() 
   public void keyReleased(KeyEvent evt) 
      // your code
   
);

希望这段代码有所帮助。

【讨论】:

【参考方案3】:
Note that I can't use Action listener for this.

这不会让我有任何意义,然后使用 ItemListener

Any idea how to solve this?

永远不要将KeyListener 用于Swing JComponents,改用(Note that I can't use Action listener for this.)KeyBindings,

注意ENTER key 默认在API 中为JComboBox 实现,必须从ENTER key pressed 覆盖此操作

【讨论】:

【参考方案4】:

一种选择是用您自己的替换 KeySelectionManager 接口。您想替换 JComboBox.KeySelectionManager 因为它负责获取输入的字符并返回应选择的行号(作为 int)。

【讨论】:

【参考方案5】:

请检查ev.getkeycode()的事件ASCII码,检查是数字还是字符。如果它既不是数字也不是字符,则什么也不做。 如果这是您想要的,请执行此过程。

【讨论】:

【参考方案6】:

如果您使用的是 Netbeans,则右键单击您的组合框并选择自定义代码。 添加以下代码行

JTextComponent editor = (JTextComponent) Code.getEditor().getEditorComponent();
editor.addKeyListener(new KeyAdapter() 
   public void keyReleased(KeyEvent evt) 
        if(evt.getKeyCode()==10)
            //do your coding here.
   
);

【讨论】:

以上是关于用于 Enter 键的 Java 可编辑 JCombobox Keylistener 事件的主要内容,如果未能解决你的问题,请参考以下文章

让 Enter 键的行为类似于 QTableWidget 中的 Tab

用于全局捕获媒体中心远程特殊键的 C# API

输入数字字段时移动浏览器上的“enter/next”键的行为

Windows UWP中带有“Enter”键的虚拟键盘Numpad

处理 UWP 应用程序上的“Enter”键

如何防止在 ag-grid-react cellEditor 组件中按下“Enter”键的事件传播?