• 締切済み

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イベントを取得するにはどうすればよいでしょうか。 長ったらしくてもうしわけありません。。。 次の投稿にサンプルのソースを記述します。

みんなの回答

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.3

>・F10キーを押したときに「LookAndFeel」にフォーカスがいくと思いますが、 >そのときプルダウンメニューは表示されるでしょうか。  私の環境でも、「The Microsoft Windows Look and Feel」の場合だけF10キーを押したときにはメニューにフォーカスが行くだけで、プルダウンメニューは表示されません。  しかし、一回目のEnter押下時のイベントは、 KEY_PRESSED keyText=Enter KEY_TYPED keyText=Unknown KEY_RELEASED keyText=Enter  となりました。  あとは、mayamさんと同じようです。

mayam
質問者

補足

回答ありがとうございます。 j2sdk1.5をダウンロードして試してみました。 問題なく一回目のKEY_TYPED,KEY_RELEASEDイベントを受け取ることができました。 どうやらj2sdk1.4では私のような現象が出るようです。 システム上j2sdk1.5に上げるのも厳しい気がします。 困りました・・・(´-`;)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 こんばんは、サンプルを動かしてみました。 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)); }

mayam
質問者

補足

おはようございます。 返答どうもありがとうございます。 私の環境では、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)
回答No.1

とりあえず、ここの補足にサンプルソースを投稿してみてください。

mayam
質問者

補足

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