- ベストアンサー
JavaSwingのファンクションキーのイベント
- JavaのSwingでファンクションキーのイベントをひろいたいのですが、F10キーやF12キーで思うようにイベントをひろえません。
- F10キーは2回に1回しかカウントされず、F12キーは途中で反応したりしなかったりします。
- この原因と対処法を知っているひとがいたら教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
F10キーは何か特別な割り当てを期待しているらしく、F10キーの押下で他のファンクションキーのオン/オフを切り替えているようですね。なぜこうなっているかは、ちょっと調べた限りわかりません。 回避方法というか、期待されている実装はF10キーが押された時の動作をこちらで定義すればよいということなので、 以下のようにしました。 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class WindowTest extends JFrame { JLabel lbl = new JLabel("0"); JPanel panel = new JPanel(); public static void main(String[] args) { WindowTest w = new WindowTest(); } public WindowTest() { panel.addKeyListener(new KeyAdapter(){ private int intKeyPress =0; @Override public void keyPressed(KeyEvent e) { lbl.setText(String.valueOf(intKeyPress++)); } }); //KeyEvent.VK_F10はF10キーを押下、0はInputEventのMASK値(今回はMASKしないので0) //F10キーを押した時、Action名Refreshを実行するように登録する。(Refreshは適当な名前) panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10,0),"Refresh"); //Action名RefreshのActionListenerを登録する。(RefreshはInputMapと合わせる) panel.getActionMap().put("Refresh",new AbstractAction(){ public void actionPerformed(ActionEvent ae) { //とりあえず、サンプルとしてrepaintする。何もActionしないでも可。 JFrame frame = (JFrame)((JComponent)ae.getSource()).getTopLevelAncestor(); frame.getContentPane().repaint(); } }); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(320, 160); //JFrameはJComponentを継承しないので、getContentPane()で取得したコンポーネントに対してaddする。 this.getContentPane().add(panel); panel.add(lbl); this.setLocationRelativeTo(null); this.setVisible(true); } } で、このJPanelを親JComponentとして子をAddしていけば、子のJComponentはInputMapとActionMapのインスタンスを勝手に参照するようです。 そうしないと個別のJComponentに全てActionを定義する必要がある、、、、かもしれません(これは未検証)。 親JComponentを変更する必要があったことから、元のプログラムの親コンポーネントをJPanelへ変更、 KeyListenerの対象をJPanelへ変更しています。 なぜF10なのか、識者の意見がほしいですね・・・。
お礼
ありがとうございました。 書かれた通りにしたら、F10のキーイベントは問題なく拾えるようになりました。 F12の方は私のコードが悪いのか反応が鈍い時がありますが、これは教えていた だいた参考ページなどをみて解決していきたいと思います。