質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1996閲覧

キー入力処理について

nakamura-

総合スコア48

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/07/20 01:21

コード public class Part01 extends JApplet{ public void init(){ setSize(1000, 800); //アプレットサイズ設定 BasePanel bp = new BasePanel(); getContentPane().add(bp); //BasePanel追加 } }
コード public class BasePanel extends JPanel{ Panel1 p1; Panel2 p2; public BasePanel(){ setBackground(Color.BLACK); //背景色設定 setLayout(null); /*Panel1の設定*/ p1 = new Panel1(); p1.setBackground(Color.WHITE); //背景色設定 p1.setOpaque(false); //透明化 p1.setSize(1000, 800); //パネルサイズ設定 add(p1); /*Panel2の設定*/ p2 = new Panel2(); p2.setBackground(Color.WHITE); //背景色設定 p2.setOpaque(false); //透明化 p2.setSize(1000, 800); //パネルサイズ設定 add(p2); } }
コード public class Panel1 extends JPanel{ /** * キー入力処理 */ @Override protected void processKeyEvent(KeyEvent ke){ if(ke.getID() == KeyEvent.KEY_PRESSED){ if(ke.getKeyCode() == KeyEvent.VK_RIGHT){ System.out.println("1111"); } } } /** * 描画処理 */ @Override protected void paintComponent(Graphics g){ super.paintComponent(g); requestFocusInWindow(); //キー入力有効化 } }
コード public class Panel2 extends JPanel{ /** * キー入力処理 */ @Override protected void processKeyEvent(KeyEvent ke){ if(ke.getID() == KeyEvent.KEY_PRESSED){ if(ke.getKeyCode() == KeyEvent.VK_ENTER){ System.out.println("2222"); } } } /** * 描画処理 */ @Override protected void paintComponent(Graphics g){ super.paintComponent(g); requestFocusInWindow(); } }

上のプログラムは
基盤となるパネルを作って、そこにPanel1,Panel2をつけ加えています。
Panel1とPanel2それぞれキー入力処理を行っていて、Panel1において右矢印キーを押せば"1111"が出力され、Panel2においてEnterキーを押せば"2222"が出力されるようにしています。
ですが実行すると、右矢印を押して"1111"は出力されるのですが、Enterキーを押しても何も反応しませんでした。
なぜそうなるのでしょうか?
2つのパネル同時にキー入力処理はできないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

問題の現象は過去の質問(JPanelでkey入力を取得したい)と同じでしょう。
「フォーカスの当たっているコンポーネントでしか処理しない」ということです。

※APIリファレンス・クラスComponent・processKeyEventの記述より

DefaultKeyboardFocusManagerは、フォーカスの所有者でないか、または表示されていないComponentにキー・イベントをディスパッチしません。

私が試した環境では、Panel2のrequestFocusInWindowメソッドの後に、Panel1のrequestFocusInWindowメソッドが実行されました。
このため、Panel2からPanel1へとフォーカスが移動し、Panel1のprocessKeyEventメソッドが実行されます。
試しに、Panel1のrequestFocusInWindowメソッドをコメントアウトすれば、Panel2のprocessKeyEventが実行されます。

投稿2016/07/20 07:14

dsuzuki

総合スコア1682

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamura-

2016/07/21 02:38

回答ありがとうございます! 確かにPanel1の方をコメントアウトしたらPanel2の方が動作しました。 「フォーカスの当たっているコンポーネントでしか処理しない」ということは、つまりPanel1とPanel2を両立することはできないということでしょうか?
tignear

2016/07/21 03:42 編集

panelを構造化してパスしてやる構造にするとか・・ 二つのPanelに同時にfocusが当たることはないようです
nakamura-

2016/07/21 04:15

今、Panel1で右矢印を押したら1111が出力されて、Panel2でEnterを押したら2222が出力されるのを、 Panelを1つにまとめて右矢印を押したら1111、Enterを押したら2222となるPanelを作るということでしょうか?
tignear

2016/07/21 04:43

それでいいならそれでもいいけど言いたかったことはちょっと違う public class BasePanel{ @Override protected void processKeyEvent(KeyEvent ke){ if(ke.getID() == KeyEvent.KEY_PRESSED){ p1.processKeyEvent(KeyEvent ke); p2.processKeyEvent(KeyEvent ke); } } }
nakamura-

2016/07/25 05:44

そういうことでしたか! 動かすことできました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問