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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

310閲覧

キーイベントについて

yukkuri

総合スコア624

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

0クリップ

投稿2018/11/24 09:41

編集2018/11/25 02:50

前提・実現したいこと

初心者のような質問で申し訳ありません。

現在フレームのクラスを作っています。そんな中、キーイベントが正しく取得されません。

発生している問題・エラーメッセージ

該当のソースコード

関係ないクラスが多いですが全て貼ります

Java

1package org.jyl.base; 2 3import java.awt.Color; 4import java.awt.Dimension; 5import java.awt.LayoutManager; 6import java.awt.AWTEvent; 7import java.awt.event.KeyEvent; 8import java.awt.event.KeyListener; 9 10import javax.swing.JPanel; 11 12import org.jyl.base.event.JylKeyEvent; 13 14public class JylPanel extends JPanel implements KeyListener 15{ 16 public JylPanel( LayoutManager layout ) 17 { 18 super( layout ); 19 20 setBackground( 0xff000000 ); 21 22 setPreferredSize( 640, 480 ); 23 24// enableEvents( AWTEvent.KEY_EVENT_MASK ); 25 this.addKeyListener( this ); 26 } 27 28 public void setBackground( int argb ) 29 { 30 setBackground( new Color( argb, true ) ); 31 } 32 33 public void setPreferredSize( int width, int height ) 34 { 35 setPreferredSize( new Dimension( width, height ) ); 36 } 37 38 public void jKeyPresser( JylKeyEvent e ){} 39 40 public void jKeyReleaser( JylKeyEvent e ){} 41 42 public void jKeyTyper( JylKeyEvent e ){} 43 44 @Override public final void keyPressed( KeyEvent e ) 45 { 46 // ここに出力メゾットを追記 -> 呼び出されず 47 KGetter k = new KGetter(); 48 JylKeyEvent key = k.get( e.getKeyCode(), e.getKeyChar(), e.getWhen() ); 49 jKeyPresser( key ); 50 } 51 52 @Override public final void keyReleased( KeyEvent e ) 53 { 54 KGetter k = new KGetter(); 55 JylKeyEvent key = k.get( e.getKeyCode(), e.getKeyChar(), e.getWhen() ); 56 jKeyReleaser( key ); 57 } 58 59 @Override public final void keyTyped( KeyEvent e ) 60 { 61 KGetter k = new KGetter(); 62 JylKeyEvent key = k.get( e.getKeyCode(), e.getKeyChar(), e.getWhen() ); 63 jKeyTyper( key ); 64 } 65}
package org.jyl.base; import org.jyl.base.event.JylKeyEvent; import org.jyl.base.event.KeyGetter; class KGetter extends KeyGetter // 別パッケージへアクセスするためのクラス { @Override public JylKeyEvent get( int kc, char kch, long wh ) { return super.get( kc, kch, wh ); } }
package org.jyl.base.event; public class JylKeyEvent { private int keycode = 0; // キーコード private char keychar = ' '; // キーに関連付けられた文字 private long when = 0; // 押された時間 JylKeyEvent(){} private JylKeyEvent( int kcode, char kchar, long when ) { keycode = kcode; keychar = kchar; this.when = when; } public char getKeyChar() { return keychar; } public int getKeyCode() { return keycode; } JylKeyEvent getInstance( int kc, char kch, long wh ) { JylKeyEvent key = new JylKeyEvent( kc, kch, wh ); return key; } public long getWhen() { return when; } }
package org.jyl.base.event; /** * キーを取得するためのクラス * 使用する必要はない */ public abstract class KeyGetter { protected static JylKeyEvent key; protected JylKeyEvent get( int kc, char kch, long wh ) { JylKeyEvent k = new JylKeyEvent(); key = k.getInstance( kc, kch, wh ); return key; } }

試したこと

KeyPressed( e )に出力メゾットを追加したが反応なし->KeyListenerの方の問題?

補足情報(FW/ツールのバージョンなど)

Raspberry pi、javaは8です。

###追記

回答を受けて、少しソースに追記しました

processKeyEventとenableEventsを使用しても無理でした。

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

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

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

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

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

ngsvx

2018/11/24 13:54

キーリスナーへの登録はどこで行っていますか?
yukkuri

2018/11/25 02:27

つけ忘れです。すいません。
guest

回答1

0

ベストアンサー

クラス、JylPanelのコンストラクタに
this.addKeyListener(this);
と追加してみてください。

KeyListenerを利用するにはコンポーネントにKeyListenerを実装したクラスのインスタンスを登録する必要があります。

この場合はJylPanelでKeyEventを受け取りたいように見えるので、
イベントの発生源であるJylPanelのインスタンスにaddKeyListenerで
KeyListenerを実装したJylPanelのインスタンスを渡します。

ちなみにイベントを受け取る必要がなくなったらremoveKeyListenerというメソッドで登録を解除できます。

投稿2018/11/25 00:58

glat2238

総合スコア124

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

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

yukkuri

2018/11/25 02:53 編集

追加してみました。しかし、KeyPressedに出力メゾットを書いても呼び出されなかったのですが、どうしたらいいでしょうか。
glat2238

2018/11/25 03:14

パネルのコンストラクタにsetFocusable(true)を加えて、 パネルにrequestFocusInWindow()を呼び出してみてくさい。
yukkuri

2018/11/25 03:38

ありがとうございます!解決しました。
glat2238

2018/11/25 03:41

良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問