У меня есть класс, который представляет собой пользовательский компонент-свинг, расширяющий JComponent. Я пытаюсь сделать так, чтобы подкомпоненты этого пользовательского компонента были бы перемещаемыми по фокусу простым нажатием TAB или SHIFT + TAB. Вместо этого они кажутся доступными только при нажатии CTRL + TAB или CTRL + SHIFT + TAB по умолчанию, независимо от того, что я указываю иначе. Я сослался на ответ из здесь , хотя мой компонент не является JTextArea, и я попытался установить клавиши перемещения фокуса непосредственно с помощью кода ниже в конструкторе, но безрезультатно.
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 () устарела.