Вкладка над компонентом JTable - PullRequest
3 голосов
/ 09 июля 2009

У меня есть панель, содержащая несколько компонентов, одним из которых является JTable. Когда JTable имеет фокус и нажата клавиша TAB, поведение по умолчанию заключается в перемещении фокуса от ячейки к ячейке в таблице. Мне нужно изменить это, чтобы сосредоточиться на следующем компоненте, вместо этого, то есть оставить JTable полностью.

Ctrl-TAB достигает желаемых результатов, но не приемлем для пользователя. Я могу добавить ключевой слушатель к таблице и изменить фокус при нажатии клавиши TAB, но такое ощущение, что может быть лучший способ сделать это.

Есть идеи?

Спасибо ...

Ответы [ 2 ]

4 голосов
/ 09 июля 2009

Обычно вы делаете это, добавляя Action к карте действий компонентов и затем связывая с ней нажатие клавиши во входной карте компонента (пример кода ниже). Однако это не будет работать для табуляции, так как это событие используется подсистемой фокуса , если не добавлена ​​следующая строка для удаления табуляции в качестве клавиши обхода фокуса:

tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet());

Вот полный пример кода:

public static void main(String[] args) {
    final JTabbedPane tp = new JTabbedPane();

    // Remove Tab as the focus traversal key - Could always add another key stroke here instead.
    tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet());

    KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);

    Action nextTab = new AbstractAction("NextTab") {
        public void actionPerformed(ActionEvent evt) {
            int i = tp.getSelectedIndex();
            tp.setSelectedIndex(i == tp.getTabCount() - 1 ? 0 : i + 1);
        }
    };

    // Register action.
    tp.getActionMap().put("NextTab", nextTab);
    tp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ks, "NextTab");

    tp.addTab("Foo", new JPanel());
    tp.addTab("Bar", new JPanel());
    tp.addTab("Baz", new JPanel());
    tp.addTab("Qux", new JPanel());

    JFrame frm = new JFrame();

    frm.setLayout(new BorderLayout());
    frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frm.add(new JButton(nextTab), BorderLayout.NORTH);
    frm.add(tp, BorderLayout.CENTER);
    frm.setBounds(50,50,400,300);
    frm.setVisible(true);
}
1 голос
/ 09 июля 2009

Что ж, вы, вероятно, не хотите просто избавляться от действия Tab, потому что у него есть другие обязанности. Например, когда вы редактируете ячейку, действие Tab останавливает редактирование ячейки, прежде чем перейти к следующей ячейке. Таким образом, вы, вероятно, захотите сохранить это поведение, добавляя дополнительное поведение для изменения фокуса на следующий компонент.

Я называю это «упаковкой действия», и вы можете найти пример этого, проверив действие Table Tabbing . Вы должны иметь возможность легко настроить код для использования KeyboardFocusManager для передачи фокуса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...