如何在不使用isManagingFocus()的情况下将JComponent设置为使用TAB而不是CTRL + TAB遍历

时间:2019-01-08 20:16:49

标签: java swing keyboard

我有一个类,它是扩展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()已弃用。

0 个答案:

没有答案