問題
私は自分が書いたアプリケーションでキーバインドを正しく機能させるためにいじっています。
以前は、次のバリエーションを使用していました。
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_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");
}
}
}
問題が何であるかを誰かが知っていますか?