java - 如何检测用户何时真正选择了 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);
}
}
解决方案
我需要一些只有在用户实际点击并且弹出窗口消失时才会触发的东西。
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;
}
};
推荐阅读
- amazon-web-services - Terraform如何在“ip”类型的目标组中注册已知的私有IP地址
- r - 如何在 R 中为大型数据框使用字典?
- python - 如何使用 map() 和 filter() 函数而不是 for 循环使用 Python 3 删除空目录?
- html - 如何允许使用箭头键在组中导航收音机,并使它们不可见并占用零空间?
- python-3.x - 在 URL 中使用 ID 或 Slug 以外的类字段
- java - RestAssured:如何避免在请求中发送 User-Agent 标头
- assembly - 我在 ARM 上的 Hello World 应用程序中的分段错误
- php - mysql - 使用当前日期更新行
- amazon-web-services - AWS Step Function 能否依赖并发 Lambda 完成?
- python - 多级 dockerfile:如何在没有 --user pip3 参数的情况下安装?