【发布时间】:2012-06-12 19:09:02
【问题描述】:
问题
我一直在努力使键绑定在我编写的应用程序中正常工作。
以前,我一直在使用以下变体;
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,那么它会按预期工作。
其他一些可能相关的信息(但我真的不这么认为);
- 我正在为面板使用 MigLayout。不要认为这会影响任何事情,但谁知道呢。
- 我还有其他键绑定(即绑定到其他组件的其他键击)
下面是一些示例代码:
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");
}
}
}
有谁知道问题出在哪里?
【问题讨论】:
-
“我正在为面板使用 MigLayout。不要认为这会影响任何事情,但谁知道呢。” 如果你将它换成
FlowLayout和问题仍然存在。为了尽快获得更好的帮助,请发帖SSCCE。
标签: java swing key-bindings keyevent miglayout