- 締切済み
JavaのLookAndFeelとメニューのイベントについて
誰か知ってる方教えてください(><) 環境は下記です。 OS :WinXP java:j2sdk1.4.2_08 ツール:eclips3.1.1 普通のJFrameを使って画面を作成し、メニューバー にメニューを追加して、メニューにてリターンキー のイベントを取得するプログラムを作成しております。 JMenuを継承したクラスを作成してイベント取得メソッドをオーバーライドしイベントを取得しようとしているのですが、Look and Feelの設定によってイベントが取れない場合があります。 手順を下記に記述します。 1.フレームを表示する。 2.F10キーを押してメニューにフォーカスを当てる。 3.リターンキーを押す。 4.JMenuを継承したクラスでイベントを受け付ける。 受け付けるメソッドはprocessKeyEvent(KeyEvent e, MenuElement path[],MenuSelectionManager manager) です。 現象的にはThe Microsoft Windows Look and Feelの場合に限り、一回目のリターン押下時のKEY_TYPEDおよびKEY_RELEASEDのイベントが取れないようです。 KEY_PRESSEDイベントのみ取得できます。 2回目以降はKEY_PRESSED,KEY_TYPED,KEY_RELEASEDともに取得できるようです。 【質問】 ・これはバグなのでしょうか? ・メニューにて一回目のリターンのKEY_RELEASEDイベントを取得するにはどうすればよいでしょうか。 長ったらしくてもうしわけありません。。。 次の投稿にサンプルのソースを記述します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- PecoPlus
- ベストアンサー率76% (144/188)
>・F10キーを押したときに「LookAndFeel」にフォーカスがいくと思いますが、 >そのときプルダウンメニューは表示されるでしょうか。 私の環境でも、「The Microsoft Windows Look and Feel」の場合だけF10キーを押したときにはメニューにフォーカスが行くだけで、プルダウンメニューは表示されません。 しかし、一回目のEnter押下時のイベントは、 KEY_PRESSED keyText=Enter KEY_TYPED keyText=Unknown KEY_RELEASED keyText=Enter となりました。 あとは、mayamさんと同じようです。
- PecoPlus
- ベストアンサー率76% (144/188)
こんばんは、サンプルを動かしてみました。 OS :WinXP java:j2sdk1.5.0_07 私の環境では、The Microsoft Windows Look and Feelだけが特別な動きをしているようでは、ありませんでした。 すべてのルックアンドフィールにおいて、 メニューの「LookAndFeel」でEnterを押したときには、 KEY_PRESSED keyText=Enter KEY_TYPED keyText=Unknown KEY_RELEASED keyText=Enter メニュー項目のどれかでEnterを押して、プルダウンメニューが消えたときは、 KEY_PRESSED keyText=Enter のみとなりました。 この動きは、バグというより仕様のように思われるのですが、mayamさんの環境では、やはり、違った動きになりますでしょうか? あと、processKeyEventメソッドをオーバーライドしていますが、親のprocessKeyEventを呼んでおかないと、MenuKeyEventがうごかなくなるとおもいますが、どうでしょう? public void processKeyEvent(KeyEvent e, MenuElement path[], MenuSelectionManager manager) { super.processKeyEvent(e, path, manager); ↑ これ System.out.println("★EVENT = " + e.toString()); System.out.println("in JMenuItem.processKeyEvent/3 for " + getText() + " " + KeyStroke.getKeyStrokeForEvent(e)); }
補足
おはようございます。 返答どうもありがとうございます。 私の環境では、The Microsoft Windows Look and Feelの場合に限り、F10キーを押して「LookAndFeel」にフォーカスを当てたときにメニューのプルダウンメニューが表示されません。そして一回目のEnter時にKEY_PPRESSEDのみを受け付け、プルダウンメニューが表示されます。2回目以降はプルダウンメニューが表示された状態となり、この状態でEnterを押すと、KEY_PRESSED,KEY_TYPED,KEY_PRESSEDイベントが受け取れるようです。この違いが関係あるのかしれませんね。。 【質問】 ・F10キーを押したときに「LookAndFeel」にフォーカスがいくと思いますが、そのときプルダウンメニューは表示されるでしょうか。 >メニュー項目のどれかでEnterを押して、プルダウンメニューが消えたときは、 > >KEY_PRESSED keyText=Enter > >のみとなりました。 これは同じです。 >この動きは、バグというより仕様のように思われるの>ですが、mayamさんの環境では、やはり、違った動きになりますでしょうか? やはり同じようにWindows Look and Feelのときのみ一回目のEnter時はKEY_PRESSEDイベントしかうけつけないようです。 > あと、processKeyEventメソッドをオーバーライドしていますが、親のprocessKeyEventを呼んでおかない>と、MenuKeyEventがうごかなくなるとおもいますが、>どうでしょう? おっしゃるとおりです。 最終的には、メニューでEnterを押された場合にマウスの左クリックイベントに差し替えてイベントを発生させることを試みる予定です。 まずはイベントが取れればなんとかなるかなぁと思って省略していました。Enter1回目のKEY_RELEASEDを受けとれればなんとかなるのですが・・・ jdkのバージョンを変えて試してみようかと思っております。 あと、1回目のKEY_RELEASEDを拾えるようにいろいろ検討してみます。 また何かお気づきの点がございましたら、どうぞよろしくお願いいたします。
- PecoPlus
- ベストアンサー率76% (144/188)
とりあえず、ここの補足にサンプルソースを投稿してみてください。
補足
2重に投稿できなくてこまってました。 ありがとうございます。 以下にサンプルを記述します。 800超えそうなのでぎゅうぎゅうでかいてます。 package demo; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.*; public class LookAndFeelTest extends JFrame { UIManager.LookAndFeelInfo[] lookAndFeelInfos; JLabel label = new JLabel("Demo"); JTextField textField; public LookAndFeelTest() { super("Look & Feel"); setDefaultCloseOperation(EXIT_ON_CLOSE); lookAndFeelInfos = UIManager.getInstalledLookAndFeels(); setJMenuBar(createMenu()); getContentPane().add(label, BorderLayout.NORTH); textField = new JTextField(UIManager.getLookAndFeel().getDescription()); getContentPane().add(textField, BorderLayout.CENTER); } public JMenuBar createMenu() { JMenuBar menuBar = new JMenuBar(); SampleMenu lafMenu = new SampleMenu("LookAndFeel"); for (int i = 0; i < lookAndFeelInfos.length; i++) { final String lafClassName = lookAndFeelInfos[i].getClassName(); lafMenu.add(new AbstractAction(lookAndFeelInfos[i].getName()) { public void actionPerformed(ActionEvent ev) { changeLookAndFeel(lafClassName); } }); } menuBar.add(lafMenu); return menuBar; } private void changeLookAndFeel(String lafClassName) { try { UIManager.setLookAndFeel(lafClassName); SwingUtilities.updateComponentTreeUI(this); textField.setText(UIManager.getLookAndFeel().getDescription()); this.pack(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { JFrame window = new LookAndFeelTest(); window.pack(); window.setVisible(true); } } class SampleMenu extends JMenu { public SampleMenu(String s) { super(s); } public void processKeyEvent(KeyEvent e, MenuElement path[], MenuSelectionManager manager) { System.out.println("★EVENT = " + e.toString()); System.out.println("in JMenuItem.processKeyEvent/3 for " + getText() + " " + KeyStroke.getKeyStrokeForEvent(e)); } }
補足
回答ありがとうございます。 j2sdk1.5をダウンロードして試してみました。 問題なく一回目のKEY_TYPED,KEY_RELEASEDイベントを受け取ることができました。 どうやらj2sdk1.4では私のような現象が出るようです。 システム上j2sdk1.5に上げるのも厳しい気がします。 困りました・・・(´-`;)