有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何检测用户何时真正选择了组合框的菜单项?

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

我如何区分这些“中间”选择和组合框中正确的、最终的用户选择

我试着查看变量,比如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);
    }    
}

共 (1) 个答案

  1. # 1 楼答案

    I need something that only fires when the user actually clicks and the popup disappears.

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