[英]Java: JPanel doesn't pick up keyboard bindings
我一直在努力使键绑定在我编写的应用程序中正常工作。
以前,我一直在使用以下变体; panel.registerKeyboardAction(this, "createNewFood", KeyStroke.getKeyStroke(KeyEvent.VK_I, KeyEvent.CTRL_DOWN_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW);
但是,由于我在文档中读到了registerKeyboardAction被标记为已弃用,我尝试切换到首选方法,就像这样; panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("control I"), new NewFoodAction());
不幸的是,这似乎不起作用。
我搜索过网络,我尝试了一系列不同的方法,但没有成功;
getRootPane()
的结果中。 没工作。 WHEN_IN_FOCUSED_WINDOW
, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
, WHEN_FOCUSED
,无效。 panel.setFocusable(true)
; 没用。 panel.requestFocusInWindow()
来查看它是否可以有条件地工作; 没用。 如果我将键绑定附加到另一个组件,例如JTextField,那么它可以正常工作。
其他一些可能相关的信息 (但我并不认为是这样);
这是一些示例代码:
public FoodFrame() {
super("MealTrack");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(1400, 600));
setLocation(300, 100);
setVisible(true);
panel = new JPanel(new MigLayout("fill", "[grow][]", "[][][][grow][][]"));
add(panel);
panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("control I"), new NewFoodAction());
pack();
filter.requestFocusInWindow();
}
private class NewFoodAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("called");
}
}
}
有谁知道这个问题似乎是什么?
根据Jcomponent文档 ,您正在映射键输入,但它们执行的操作实际上并未映射到面板。 代码... panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("control I"), "newfood!");
......你还必须......
panel.getActionMap().put("newfood!", [Some actionListener that does what you need to do]);
不完全确定会纠正这个问题,但希望能为您解决问题。 祝好运!
你做错了。 您需要同时使用ActionMap和InputMap 。 你应该做:
panel.getInputMap(con).put(KeyStroke.getKeyStroke("control I"), "createNewFood");
panel.getActionMap().put("createNewFood", new NewFoodAction());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.