Java 在JTable组件上的选项卡
我有一个包含许多组件的面板,其中一个是Java 在JTable组件上的选项卡,java,swing,jtable,Java,Swing,Jtable,我有一个包含许多组件的面板,其中一个是JTable。当JTable具有焦点且按下TAB键时,默认行为是将焦点从表格中的一个单元格移动到另一个单元格。我需要将此更改为关注下一个组件,即完全保留JTable Ctrl-TAB可获得所需的结果,但用户无法接受。我可以向表中添加一个键侦听器,并在按下TAB键时更改焦点,但感觉可能有更好的方法来实现这一点 有什么想法吗 感谢…您通常会通过向组件操作映射添加一个操作,然后在组件的输入映射中绑定一个按键来实现这一点(下面的示例代码)。但是,这对tab不起作用,
JTable
。当JTable
具有焦点且按下TAB键时,默认行为是将焦点从表格中的一个单元格移动到另一个单元格。我需要将此更改为关注下一个组件,即完全保留JTable
Ctrl-TAB可获得所需的结果,但用户无法接受。我可以向表中添加一个键侦听器,并在按下TAB键时更改焦点,但感觉可能有更好的方法来实现这一点
有什么想法吗
感谢…您通常会通过向组件操作映射添加一个
操作,然后在组件的输入映射中绑定一个按键来实现这一点(下面的示例代码)。但是,这对tab不起作用,因为此事件被焦点子系统占用,除非添加以下行以将tab作为焦点遍历键删除:
tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet());
tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,Collections.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);
}
publicstaticvoidmain(字符串[]args){
最终JTabbedPane tp=新JTabbedPane();
//移除选项卡作为焦点遍历键-始终可以在此处添加另一个键笔划。
tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,Collections.emptySet());
击键ks=击键.getKeyStroke(KeyEvent.VK_选项卡,0);
Action nextTab=新抽象操作(“nextTab”){
已执行的公共无效操作(操作事件evt){
int i=tp.getSelectedIndex();
tp.setSelectedIndex(i==tp.getTabCount()-1?0:i+1);
}
};
//注册操作。
tp.getActionMap().put(“NextTab”,NextTab);
tp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ks,“NextTab”);
tp.addTab(“Foo”,newjpanel());
tp.addTab(“Bar”,新的JPanel());
tp.addTab(“Baz”,newjpanel());
tp.addTab(“Qux”,新的JPanel());
JFrame frm=新JFrame();
frm.setLayout(新的BorderLayout());
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.add(新JButton(nextTab),BorderLayout.NORTH);
frm.add(tp,边界布局中心);
法国法郎立根(50,50400300);
frm.setVisible(真);
}
您可能不想仅仅摆脱选项卡操作,因为它还有其他职责。例如,编辑单元格时,选项卡操作会在移动到下一个单元格之前停止单元格编辑。因此,您可能希望在添加额外行为以将焦点更改为下一个组件时保留此行为
我将其称为“包装动作”,您可以通过查看动作来找到一个例子。您应该能够轻松自定义代码,以使用KeyboardFocusManager转移焦点。这就是我需要的技巧。无法找出TAB不工作的原因,但有一个想法是因为FocusPolicy。我认为正确的解决方案发布在这里: