java - 如何检测用户何时真正选择了 ComboBox 的菜单项?

标签 java swing

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

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

我尝试查看诸如 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);
    }    
}

最佳答案

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

关于java - 如何检测用户何时真正选择了 ComboBox 的菜单项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54451917/

相关文章:

java - 如何使用 Robot 类触发组件上的单击事件?

java - keyListener 有问题

java - Spring框架,我需要一个变量来依赖于 session

java - OpenJDK 14.0.1 给出 "the switch expression does not cover all possible input values"

java - 缩放后getWidth不返回不同的值

java - 将背景图像添加到包含其他组件的面板

java - JMS QPID 句柄重新连接

java - 在一个简单的 Maven hibernate 项目中出现错误 "java.lang.NoClassDefFoundError: org/hibernate/cfg/Mappings"

Java Swing - 背景图像未显示

java - 在 Java 中嵌入 Gecko/WebKit