【问题标题】:Java: JPanel doesn't pick up keyboard bindingsJava:JPanel 不接受键盘绑定
【发布时间】: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


【解决方案1】:

你做错了。 您需要同时使用 ActionMap 和 InputMap。你应该这样做:

panel.getInputMap(con).put(KeyStroke.getKeyStroke("control I"), "createNewFood");
panel.getActionMap().put("createNewFood", new NewFoodAction());

【讨论】:

  • 有效!阅读linktutorial 它说“从技术上讲,您不需要在地图中使用动作名称;您可以使用任何对象作为地图中的“键”。但是,按照惯例,您使用一个字符串来命名行动”。另外,我怎么能在其他地方使用这种格式? getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("control F"), new GrabFocus());
  • 原因是某个人必须在某个地方注册了以“KeyStroke.getKeyStroke("cont‌​rol F")”作为键的操作。您还可以使用任何对象作为输入和操作映射中的键,不必是字符串,唯一的要求是在两个映射中使用的键必须相同。
【解决方案2】:

根据Jcomponent documentation,您正在映射键输入,但它们执行的操作实际上并未映射到面板。对于代码... 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]);

不完全确定这是否会解决问题,但希望可以为您解决问题。祝你好运!

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多