我有一个包含许多组件的面板,其中一个是JTable
。当JTable
具有焦点并按下TAB键时,默认行为是将焦点从表格内的单元格移动到单元格。我需要将其更改为关注下一个组件,即完全保留JTable
。
Ctrl-TAB可以获得所需的结果,但用户无法接受。我可以在表格中添加一个键监听器,并在按下TAB时更改焦点,但感觉好像有更好的方法可以做到这一点。
有什么想法吗?
...谢谢
答案 0 :(得分: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);
}
答案 1 :(得分:1)
嗯,你可能不想只是摆脱Tab Action,因为它还有其他责任。例如,在编辑单元格时,“选项卡操作”会在移动到下一个单元格之前停止单元格编辑。因此,您可能希望保留此行为,同时添加额外的行为以将焦点更改为下一个组件。
我将此称为“包装操作”,您可以通过查看Table Tabbing操作找到此示例。您应该能够轻松自定义代码以使用KeyboardFocusManager来传输焦点。