首页 > 解决方案 > 如何检测用户何时真正选择了 ComboBox 的菜单项?

问题描述

我目前面临的情况是,如果用户单击我的 ComboBox 并用他的键移动选择,则选择侦听器将继续被调用,尽管出于所有目的,用户仍然没有真正做出选择。

如何将这些“中间”选择与我的 ComboBox 中正确的、最终的用户选择区分开来?

我尝试查看变量,例如isPopupVisible甚至玩,PopupMenuListener但它们似乎并没有真正帮助。

谢谢

编辑:违规代码示例:

public class Main extends JFrame {    
    public Main() {
        setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));

        JComboBox<String> comboBox = new JComboBox<>();
        comboBox.setModel(new DefaultComboBoxModel<>(new String[] { "a", "b", "c" }));
        comboBox.addItemListener(e -> {
            System.out.println(e.getItem());
        });
        add(comboBox);
    }    
}

标签: javaswing

解决方案


我需要一些只有在用户实际点击并且弹出窗口消失时才会触发的东西。

comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);

设置上述属性,以便事件仅在鼠标释放或 Enter 键时生成。

笔记:

  1. 如果您使用一个ActionListner事件将始终在选择一个项目时生成。

  2. 如果您使用一个ItemListener事件,则仅当您从先前的选择中更改所选项目时才会生成该事件。

编辑:

您可以使用以下方法禁用键选择:

JComboBox comboBox = new JComboBox( model )
{
    @Override
    public boolean selectWithKeyChar(char keyChar)
    {
        return false;
    }
};

编辑2:

或者,作为一种技巧,您可以在进行密钥搜索时禁用您的侦听器。代码可能类似于:

JComboBox comboBox = new JComboBox( model )
{
    @Override
    public boolean selectWithKeyChar(char keyChar)
    {
        // remove the listener here

        // This will cause the selected index to change
        Boolean result = super.selectWithKeyChar(keyChar);

        // add the listener back here

        return result;
    }
};

推荐阅读