1

問題

私は自分が書いたアプリケーションでキーバインドを正しく機能させるためにいじっています。

以前は、次のバリエーションを使用していました。 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());

残念ながら、これは機能していないようです。

私が試したこと

私はWebを検索しましたが、さまざまなアプローチを試しましたが失敗しました。

  • キーをパネルにバインドする代わりに、の結果にキーをアタッチしてみましたgetRootPane()。動作しませんでした。
  • 私はさまざまな「条件」をすべて試しました。WHEN_IN_FOCUSED_WINDOW、、、WHEN_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");
    }

}

}

問題が何であるかを誰かが知っていますか?

4

2 に答える 2

2

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]);

それで問題が解決するかどうかは完全にはわかりませんが、うまくいけば問題は解決します。幸運を!

于 2012-06-12T19:20:53.140 に答える
2

あなたはそれを誤解している。ActionMapとInputMapの両方を使用する必要があります。やったほうがいい:

panel.getInputMap(con).put(KeyStroke.getKeyStroke("control I"), "createNewFood");
panel.getActionMap().put("createNewFood", new NewFoodAction());
于 2012-06-12T19:22:11.670 に答える