2009-07-09 2 views
3

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

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

Любые идеи?

Спасибо ...

+0

Я думаю, что правильное решение опубликовано здесь: http://stackoverflow.com/a/12157344/140278 – Daniel

ответ

1

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

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

4

Вы обычно делаете это путем добавления 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); 
} 
+0

Это был совет, который мне нужен. Не удалось выяснить, почему TAB не работает, но подумал, что это из-за FocusPolicy. –