我正在尝试找出如何检测JComboBox失去焦点的方法,以及用户是通过按Tab键还是通过单击组件区域外来进行操作。
将FocusListener添加到JComboBox的编辑器组件中对我没有帮助,因为我无法确定用户是使用鼠标还是通过Tab键移动了焦点。非常感谢任何想法。
编辑1: 我的目标是:
- 假设用户放下列表(JComboBox弹出菜单显示),并通过光标键导航...
- 情况1:用户按Tab键。在这种情况下,我想从项目中截取一些信息并仅显示一些部分。
- 情况2:用户在popupMenu区域之外用鼠标单击(这里有子情况,但它们都属于同一类别)。在这种情况下,我想更改JComboBox以显示之前编辑的项目,而不是用户导航的内容...
- 还有几种情况(鼠标选择项目、回车键、Esc等)。我可以轻松处理这些内容,但是检测Tab键很棘手,因为我无法捕获此事件,因为它由FocusManager处理。
编辑2:
似乎我必须使用setFocusTraversalKeysEnabled(false)
来在按TAB时得到通知,当我捕获到该事件时,我应该手动转移焦点...我不喜欢这种解决方案,但这是我能想出的最好的解决方案。
解决方案:
以下Java代码实际上解决了我的问题。正如我在编辑2中所写的那样,最简单的解决方案是禁用焦点遍历。我无耻地借用了Kleopatra的代码,现在一切都正常了。 :)
if (!isTableCellEditor()) {
comboBoxEditor.setFocusTraversalKeysEnabled(false);
Action myAction = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
handleTabPress();
comboBoxEditor.transferFocus();
} // actionPerformed() method
};
comboBoxEditor.getActionMap().put("tab-action", myAction);
comboBoxEditor.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke("TAB"), "tab-action");
} // if
感谢参与讨论的所有人!