我有一个类,它是扩展JComponent的自定义swing组件。我正在尝试使其成为该自定义组件的子组件,从而可以通过简单地按TAB或SHIFT + TAB来进行焦点遍历。取而代之的是,无论我是否另外指定,默认情况下,它们似乎只能通过按CTRL + TAB或CTRL + SHIFT + TAB才能遍历。尽管我的组件不是JTextArea,但我已经参考了here的答案,并且尝试使用构造函数中的以下代码直接设置焦点遍历键,但无济于事。
setFocusCycleRoot(true);
setFocusTraversalKeysEnabled(true);
Set<AWTKeyStroke> forwardKeys = new HashSet<>();
forwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0));
setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
Set<AWTKeyStroke> backwardKeys = new HashSet<>();
backwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK));
setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backwardKeys);
我还尝试向该组件添加一个键侦听器,以有效地对下面的代码执行相同的操作,但是那也不起作用。
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_TAB) {
if (e.isShiftDown()) {
transferFocusBackward();
} else {
transferFocus();
}
e.consume();
}
}
});
我发现,如果我不包括上面的任何一个代码块,而是重写isManagingFocus()方法以始终返回true,那么我将得到我想要的行为,但我不希望这样做,因为isManagingFocus()已弃用。