プログラムの場合、KeyListenerを使用してボタン '1'を押したときに何かをArrayListに追加していました。このリストのオブジェクトは常に視覚化されています。 KeyListenerを使用すると、ボタンを押したままにしてもうまく機能しました。Java Swing - KeyListenerよりもはるかに低速のActionListener
後で、GUIにJMenuBarを追加しました。 ArrayListに何かを追加すると、アクセラレータがKeyStroke '1'に設定された独自のJMenuItemと以前にKeyListenerと同じものを実行するActionListenerが追加されました。しかし、パフォーマンスは非常に悪いです。 '1'を押したままにしておくと、非常に遅くなります。これはKeyListenerと比較して非常に遅いです。
どうして遅いですか?私は何か間違っているのですか?より良い方法がありますか?
...
AL al = new AL();
menu.add(createMenuItem("Add", KeyEvent.VK_1, al));
}
private JMenuItem createMenuItem(String text, int key, ActionListener al){
JMenuItem menuItem = new JMenuItem(text);
menuItem.setAccelerator(KeyStroke.getKeyStroke(key, 0));
menuItem.addActionListener(al);
return menuItem;
}
private class AL implements ActionListener{
public void actionPerformed(ActionEvent e){
int keycode = ((JMenuItem)e.getSource()).getAccelerator().getKeyCode();
bla(keycode);
}
}
あなたの 'keyPressed(keycode);'コードは何をすべきでしょうか? –
私はこのメソッドを全く変更しませんでしたが、KeyListenerでうまく動作します。しかし、あなたの質問に答えるために、 (Keycode == KeyEvent.VK_1)の場合はArrayListにオブジェクトが追加され、== KeyEvent.VK_ESCAPEの場合はプログラムが終了します。 – Morrow
これはキーリスナーをトリッピングすることで行いますか? –