誰か知ってる方教えてください(><)
環境は下記です。
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イベントを取得するにはどうすればよいでしょうか。
長ったらしくてもうしわけありません。。。
次の投稿にサンプルのソースを記述します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
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さんと同じようです。
この回答への補足
回答ありがとうございます。
j2sdk1.5をダウンロードして試してみました。
問題なく一回目のKEY_TYPED,KEY_RELEASEDイベントを受け取ることができました。
どうやらj2sdk1.4では私のような現象が出るようです。
システム上j2sdk1.5に上げるのも厳しい気がします。
困りました・・・(´-`;)
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));
}
この回答への補足
おはようございます。
返答どうもありがとうございます。
私の環境では、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を拾えるようにいろいろ検討してみます。
また何かお気づきの点がございましたら、どうぞよろしくお願いいたします。
No.1
- 回答日時:
とりあえず、ここの補足にサンプルソースを投稿してみてください。
この回答への補足
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));
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- 会社・職場 ゲーセンのアルバイトで、積極的にイベントの企画をしてくれる子がいました。明るくて元気だったその子は、 3 2023/07/05 13:11
- IT・エンジニアリング ★お手上げ状態です。助けてください。ActiveReportについて 1 2023/08/20 04:29
- Visual Basic(VBA) ★お手上げ状態です。助けてください。ActiveReportについて 1 2023/08/20 04:27
- その他(アニメ・マンガ・特撮) イベントの参加について 1 2022/07/14 08:23
- 労働相談 有給取ってイベントに行くつもりでチケット購入後に何らかの理由(事業に支障が出る以外)で有給取得を取り 5 2023/04/11 11:21
- 弁護士・行政書士・司法書士・社会保険労務士 管理費滞納債務の特定承継人への承継 6 2022/04/02 16:59
- その他(アニメ・マンガ・特撮) 自分を押し通す人について 4 2023/04/02 16:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java初級 引数に適用できません
-
C# 点の描き方をおしえてくだ...
-
javaに"search"という関数 or ...
-
Google Apps Script で getRang...
-
abstract と static を一緒に付...
-
コマンドライン引数のチェック
-
public static void main (Stri...
-
Javaの関数名が長い?
-
メソッド/ルーチン
-
レコード件数の表示
-
javaのAPIの読み方がわかりません
-
説明文書でのメソッド・変数の...
-
Javaの問題なんですが、練習14-...
-
return new使用時
-
StringBufferからStringへキャ...
-
YYYYMMDD書式の日付に対する適...
-
Double,Longをファイルに書き込み
-
メソッド宣言の戻り値の型にク...
-
System.out.print
-
戻り値の異なるメソッドの多重...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
なぜprotected overrideなのか
-
Strutsでチェックボックスの値...
-
Google Apps Script で getRang...
-
abstract と static を一緒に付...
-
C# 点の描き方をおしえてくだ...
-
レコード件数の表示
-
public static void main (Stri...
-
StringBufferからStringへキャ...
-
YYYYMMDD書式の日付に対する適...
-
C# でメソッドに送られてきたOb...
-
シェルスクリプトからのJavaメ...
-
C# の ByVal と ByRef について
-
Fileの読み取り専用の解除
-
CSVから読み込んだデータの保持...
-
メソッドの引数に指定されてい...
-
javaに"search"という関数 or ...
-
Javaのメモリの管理
-
Java初心者です、エラーの意味...
おすすめ情報