Java:JPanel没有拿起键盘绑定

时间:2012-06-12 19:09:03

标签: java swing key-bindings keyevent miglayout

问题

我一直在努力使键绑定在我编写的应用程序中正常工作。

以前,我一直在使用以下变体;     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_WINDOWWHEN_ANCESTOR_OF_FOCUSED_COMPONENTWHEN_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");
    }

}

}

有谁知道这个问题似乎是什么?

2 个答案:

答案 0 :(得分: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]);

不完全确定会纠正这个问题,但希望能为您解决问题。祝你好运!

答案 1 :(得分:2)

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

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