【发布时间】:2014-09-08 15:34:02
【问题描述】:
在 JTable 中删除标准回车键绑定(按回车键选择下一行)的最简单和最快的方法是什么?
我试过了
table.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), null);
但它不起作用。我假设我们必须以某种方式为每个单元格而不是表格本身这样做。
【问题讨论】:
标签: java swing jtable key-bindings
在 JTable 中删除标准回车键绑定(按回车键选择下一行)的最简单和最快的方法是什么?
我试过了
table.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), null);
但它不起作用。我假设我们必须以某种方式为每个单元格而不是表格本身这样做。
【问题讨论】:
标签: java swing jtable key-bindings
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 和 JComponent.WHEN_IN_FOCUSED_WINDOW 具有输入键击的值。所以你想同时得到它们
更正:您需要为WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 获取InputMap
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
UPDATE :更正(在上面进行的更正删除或// commented out)
你只为InputMap设置它为JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
UPDATE 根据 OP 评论:简而言之是
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke("ENTER"), "none");
【讨论】:
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("ENTER"), "none"); 完成了这项工作。谢谢!
这似乎是最方便的方式:
table.registerKeyboardAction(
null,
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
);
若要分配操作,请将 null 替换为 ActionListener 调用或在 JDK 1.8 中替换为 e -> someMethod()
【讨论】:
更新:
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,你可以使用匿名类代替...
【讨论】:
Action而不是Input