删除JTable中的Enter键绑定

时间:2014-09-08 15:34:02

标签: java swing jtable key-bindings

在JTable中删除标准输入键绑定(按Enter键选择下一行)的最简单和最快方法是什么?

这就是我的尝试

table.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), null);

但它不起作用。我假设我们必须以某种方式为每个单元格而不是表格本身。

3 个答案:

答案 0 :(得分:3)

JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENTJComponent.WHEN_IN_FOCUSED_WINDOW具有输入击键的值。所以你想得到它们两个

更正:您需要获取InputMap

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
InputMap iMap1 = 
         table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
//InputMap iMap2 = 
        // table.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

然后,您要将地图的值设置为"none",而不是null,如How to Use Key Bindings中所述。

  

要使组件忽略它通常响应的键,您可以使用特殊操作名称" none"。例如,以下代码使组件忽略F2键。   

  component.getInputMap().put(KeyStroke.getKeyStroke("F2"), "none");

所以就这样做:

KeyStroke stroke = KeyStroke.getKeyStroke("ENTER");
iMap1.put(stroke, "none");
//iMap2.put(stroke, "none");

另请注意,当您在没有任何参数的情况下执行getInputMap()时,它与getInputMap(JComponent.WHEN_FOCUSED)基本相同。在JTable的情况下,InputMap的输入击键没有值。

How to Use Key Bindings了解详情。您将对不同的InputMaps

有更好的解释

更新:更正(通过或// commented out进行更正>

您只需为InputMap

JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT设置它
根据OP评论

更新:简称是

table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
                             .put(KeyStroke.‌​getKeyStroke("ENTER"), "none");

答案 1 :(得分:1)

这似乎是最方便的方式:

table.registerKeyboardAction(
    null,
    KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
    JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
);

指定一个操作替换null ActionListener调用或e -> someMethod()替换JDK 1.8

答案 2 :(得分:0)

更新:
David Kroukamp解决方案:

private void createKeybindings(JTable table) {
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Enter");
    table.getActionMap().put("Enter", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent ae) {}
    });
}

而且你应该够了:

table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Enter");
table.getActionMap().put("Enter",null);

我不知道是否可以使用null,您可以使用匿名类代替......