我想了解如何检测JComboBox是否在用户按下Tab或通过在组件区域外单击鼠标时失去焦点。如何检测JComboBox中的TAB按键?
将FocusListener添加到JComboBox的编辑器组件并不能帮助我,因为我无法确定用户是否使用鼠标或通过Tab键移动焦点。任何想法将不胜感激。
编辑1: 我想实现的是:
- 假设用户下拉列表(JComboBox中弹出菜单显示出来),并通过光标键导航...
- 案例1:用户按下标签。在这种情况下,我想切断项目中的一些信息,只显示一些部分。第二种情况:用户在popupMenu的区域外点击鼠标(这里我们有子库,但它们都属于同一个类别)。在这种情况下,我想要更改JComboBox以显示以前编辑的项目,而不是用户导航的项目...
- 还有其他几种情况(鼠标项拾取,输入键,转义等)。我可以很容易地处理这些,但检测标签是棘手的,因为我无法捕捉这个事件,因为它由FocusManager处理。
编辑2: 看来,我必须使用setFocusTraversalKeysEnabled(false)
按下TAB时得到通知,当我捕捉事件,我应该手动转移焦点......我不喜欢这样的解决方案,但是迄今为止我能想到的最好的。
解决方案:
下面的一段Java代码实际上是解决我的问题。正如我在编辑2最简单的解决方案是禁用焦点遍历。我无耻地借用了克列奥帕特拉的代码,现在所有的作品。 :)
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
感谢所有与会者的讨论!
*“任何想法,将不胜感激。” *解释用例的这个功能。您想通过了解哪些功能为最终用户提供? – 2012-02-12 15:01:53
安德鲁,感谢您的回复,请参阅*编辑1 *。 – DejanLekic 2012-02-12 15:15:52