我试图找出如何在用户按下标签或通过鼠标点击组件区域外时检测JComboBox是否失去焦点。
将FocusListener添加到JComboBox的编辑器组件对我没有帮助,因为我无法确定用户是否使用了鼠标或通过Tab键移动了焦点。任何想法都将不胜感激。
编辑1: 我想要实现的是:
编辑2:
似乎我必须使用setFocusTraversalKeysEnabled(false)
在按下TAB时收到通知,当我捕获该事件时,我应该手动转移焦点...我不喜欢这个解决方案,但这是迄今为止最好的我可以想出来。
解决方案:
以下一段Java代码实际上解决了我的问题。正如我在 Edit 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
感谢所有与会者参与讨论!
答案 0 :(得分:6)
据我了解你的问题,有两个不同的问题
如果是,答案是
在代码中:
final JComboBox simpleBox = new JComboBox(Locale.getAvailableLocales());
// this line configures the combo to only commit on ENTER
// or selecting an item from the list
simpleBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
//
// simpleBox.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
// Collections.EMPTY_SET);
// just noticed the OPs edit - following indeed is easier to disable _all_ traversal
// keys with one statement
simpleBox.setFocusTraversalKeysEnabled(false);
Action myAction = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
LOG.info("got it!");
simpleBox.transferFocus();
}
};
simpleBox.getActionMap().put("tab-action", myAction);
simpleBox.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke("TAB"), "tab-action");
答案 1 :(得分:3)
假设您在松开焦点之前已按下鼠标(或键)。所以听所有的键盘和鼠标点击,在失去焦点之前最后使用的是罪魁祸首。
当触发focuslost时,您将检查在窗口的任何部分按下鼠标或键时设置的变量。此变量仅记录最后按下的鼠标和/或键。当然,您必须捕获所有鼠标和按键,因为单击任何小部件都会让您失去焦点。