我目前面临的情况是,如果用户单击我的组合框并用按键移动选择,则选择监听器将继续被调用,尽管出于所有目的,用户仍然没有真正做出选择。
如何在组合框中区分这些“中间”选择和正确的最终用户选择?
我尝试查看诸如 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 键时生成事件。
注意:
如果您使用
ActionListner
,则在选择某个项目时始终会生成事件。如果您使用
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/