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

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

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

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

Q&A

解決済

2回答

1316閲覧

java awt キーリスナーについて

fire

総合スコア13

Java

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

0グッド

0クリップ

投稿2015/07/20 15:54

編集2015/07/21 02:20

ど初心者です。
javaによりトランプのスピードを一人で行うゲームのguiを描くに当たってキーボード操作によるイベントリスナーであるキーリスナーを用いたいのですがgui画面のみ表示され、コンパイルエラーが出ずにキー操作への反応がなされません。
keyTyped直下の操作
System.out.println("テスト");
もききません。
稚拙な質問ですがご教授お願いいたします。

java

1import java.awt.*; 2import java.awt.event.*; 3import javax.swing.*; 4 5public class Speed extends JPanel implements KeyListener { 6 7 // 場、山、自陣a[4]に入れるカードを配列として用意する。 8 public static int[] a = new int[4], yama = new int[56], ba = new int[53]; 9 public static int counterYAMA = 0, counterBA = 0, counterHOJU = 0; 10 11 public Speed() { 12 13 // 山に入るカードをシャッフルし配列として格納する。 14 int i; 15 for (i = 0; i < 52; i++) 16 yama[i] = i + 1; 17 for (i = 51; i > 0; i--) { 18 int r = (int) (Math.random() * 52) + 1; 19 int t = yama[r]; 20 yama[r] = yama[i]; 21 yama[i] = t; 22 } 23 for (i = 0; i < 4; i++) 24 a[i] = yama[i]; 25 counterYAMA = 4; 26 27 yama[52]=-1; 28 yama[53]=-1; //この三つは最後カードがなくなったときの表示として使う。 29 yama[54]=-1; 30 31 // gui部分。 32 //アイコンに数字とスートをあてはめる。 33 int a0 = a[0] % 13 + 1; 34 int a1 = a[1] % 13 + 1; 35 int a2 = a[2] % 13 + 1; 36 int a3 = a[3] % 13 + 1; 37 int nba = ba[counterBA] % 13 + 1; 38 String suit0 = null, suit1 = null, suit2 = null, suit3 = null, suitBA = null; 39 40 if (a[0] < 14) 41 suit0 = "c"; 42 else if (a[0] < 27) 43 suit0 = "d"; 44 else if (a[0] < 40) 45 suit0 = "h"; 46 else if (a[0] < 53) 47 suit0 = "s"; 48 if (a[1] < 14) 49 suit1 = "c"; 50 else if (a[1] < 27) 51 suit1 = "d"; 52 else if (a[1] < 40) 53 suit1 = "h"; 54 else if (a[1] < 53) 55 suit1 = "s"; 56 if (a[2] < 14) 57 suit2 = "c"; 58 else if (a[2] < 27) 59 suit2 = "d"; 60 else if (a[2] < 40) 61 suit2 = "h"; 62 else if (a[2] < 53) 63 suit2 = "s"; 64 if (a[3] < 14) 65 suit3 = "c"; 66 else if (a[3] < 27) 67 suit3 = "d"; 68 else if (a[3] < 40) 69 suit3 = "h"; 70 else if (a[3] < 53) 71 suit3 = "s"; 72 if (counterBA > 0){ 73 if (ba[counterBA] < 14) 74 suitBA = "c"; 75 else if (ba[counterBA] < 27) 76 suitBA = "d"; 77 else if (ba[counterBA] < 40) 78 suitBA = "h"; 79 else if (ba[counterBA] < 53) 80 suitBA = "s"; 81 } 82 83 Icon man1 = null,man2 = null,man3 = null,man4 = null,iba = null,iyama = null; 84 if (a[0] > 0) 85 man1 = new ImageIcon(String.format("%s%02d.gif", suit0, a0)); 86 else 87 man1 = new ImageIcon("z01.gif"); 88 if (a[1] > 0) 89 man2 = new ImageIcon(String.format("%s%02d.gif", suit1, a1)); 90 else 91 man2 = new ImageIcon("z01.gif"); 92 if (a[2] > 0) 93 man3 = new ImageIcon(String.format("%s%02d.gif", suit2, a2)); 94 else 95 man3 = new ImageIcon("z01.gif"); 96 if (a[3] > 0) 97 man4 = new ImageIcon(String.format("%s%02d.gif", suit3, a3)); 98 else 99 man4 = new ImageIcon("z01.gif"); 100 101 if (0 < counterBA && counterBA < 52) 102 iba = new ImageIcon(String.format("%s%02d.gif", suitBA, nba)); 103 104 if (counterYAMA < 52) 105 iyama = new ImageIcon("z01.gif"); 106 107 108 //パネルの配置。 109 JPanel p1,p2; 110 JButton b1, b2, b3, b4, b5, b6,b7; 111 112 p1 = new JPanel(); 113 p2 = new JPanel(); 114 b1 = new JButton(man1); 115 b2 = new JButton(man2); 116 b3 = new JButton(man3); 117 b4 = new JButton(man4); 118 if (counterBA == 0) 119 b5 = new JButton("sボタンでゲーム開始だよ!"); 120 else if (counterBA == 52){ 121 b5 = new JButton(String.format("finish!!\n%d回補充したね!", counterHOJU-1)); 122 System.out.println("finish!!\n"+ (counterHOJU - 1) +"回補充したね!"); 123 } 124 else 125 b5 = new JButton(iba); 126 b6 = new JButton("←場 山→"); 127 if (counterYAMA == 52) 128 b7 = new JButton("ラストスパート!"); 129 else 130 b7 = new JButton(iyama); 131 132 p1.setLayout(new BoxLayout(p1,BoxLayout.X_AXIS)); 133 p1.add(b1); 134 p1.add(b2); 135 p1.add(b3); 136 p1.add(b4); 137 p2.setLayout(new BoxLayout(p2,BoxLayout.X_AXIS)); 138 p2.add(b5); 139 p2.add(b6); 140 p2.add(b7); 141 142 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 143 add(p2); 144 add(p1); 145 146 setFocusable(true); 147 addKeyListener(this); 148 149 // ゲーム開始! 150 } 151 public void keyTyped(KeyEvent e) { 152 153 int key = e.getKeyCode(); 154 if (key == 's') { 155 System.out.println("sのキーが押された.山から場へ"); 156 ba[counterBA] = yama[counterYAMA]; 157 counterBA++; 158 counterYAMA++; 159 counterHOJU++; 160 System.out.println("場" + ba[counterBA] + " 山" + yama[counterYAMA] + "\n\n自陣" + a[0] + " " + a[1] + " " 161 + a[2] + " " + a[3]); 162 } else if (key == 'h') { 163 System.out.println("hのキーが押された"); 164 ba[counterBA] = a[0]; 165 counterBA++; 166 if (counterYAMA < 52) { 167 a[0] = yama[counterYAMA]; 168 counterYAMA++; 169 } 170 System.out.println("場" + ba[counterBA] + " 山" + yama[counterYAMA] + "\n\n自陣" + a[0] + " " + a[1] + " " 171 + a[2] + " " + a[3]); 172 } else if (key == 'j') { 173 System.out.println("jのキーが押された"); 174 ba[counterBA] = a[1]; 175 counterBA++; 176 if (counterYAMA < 52) { 177 a[1] = yama[counterYAMA]; 178 counterYAMA++; 179 } 180 System.out.println("場" + ba[counterBA] + " 山" + yama[counterYAMA] + "\n\n自陣" + a[0] + " " + a[1] + " " 181 + a[2] + " " + a[3]); 182 183 } else if (key == 'k') { 184 System.out.println("kのキーが押された"); 185 ba[counterBA] = a[2]; 186 counterBA++; 187 if (counterYAMA < 52) { 188 a[2] = yama[counterYAMA]; 189 counterYAMA++; 190 } 191 System.out.println("場" + ba[counterBA] + " 山" + yama[counterYAMA] + "\n\n自陣" + a[0] + " " + a[1] + " " 192 + a[2] + " " + a[3]); 193 } else if (key == 'l') { 194 System.out.println("lのキーが押された"); 195 ba[counterBA] = a[3]; 196 counterBA++; 197 if (counterYAMA < 52) { 198 a[3] = yama[counterYAMA]; 199 counterYAMA++; 200 } 201 System.out.println("場" + ba[counterBA] + " 山" + yama[counterYAMA] + "\n\n自陣" + a[0] + " " + a[1] + " " 202 + a[2] + " " + a[3]); 203 } 204 repaint(); 205 } 206 207 public void keyPressed(KeyEvent e) { 208 } 209 210 public void keyReleased(KeyEvent e) { 211 } 212 213 public static void main(String[] args) { 214 JFrame Speedframe = new JFrame("JPanel"); 215 Speedframe.setBackground(Color.CYAN); 216 Speedframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 217 Speed s = new Speed(); 218 Speedframe.add(s, BorderLayout.CENTER); 219 Speedframe.pack(); 220 Speedframe.setVisible(true); 221 } 222 223}

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

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

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

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

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

guest

回答2

0

ベストアンサー

このコードを実行し、
デバッガで止めると、keyTypedメソッドは呼ばれています。

KeyEvent#getKeyCodeを使っていますが、
KeyEventのJavaDocを見ると、
「キー・タイプ・イベントに対しては、getKeyCodeメソッドは常にVK_UNDEFINEDを返します。」
とある通り、keyTypedではこのメソッドは常にVK_UNDEFINED(0)を返すので、
if文のどの分岐にも入らず、何もしていないように見える結果になっています。

「getKeyCharメソッドは常に有効なUnicode文字またはCHAR_UNDEFINEDを返します。文字入力はKEY_TYPEDイベントによって報告されます。
KEY_PRESSEDおよびKEY_RELEASEDイベントは必ずしも文字入力に関連付けられていません。
そのため、getKeyCharメソッドの結果は、KEY_TYPEDイベントに対してのみ有効です。」

という記述のある、KeyEvent#getKeyCharを使用してください。

それから、蛇足かもしれませんが、
メソッドが呼ばれているかどうかを調べる場合は、
メソッドの先頭に(今回であればint key = e.getKeyCode();)ブレークポイントを入れるか、
それより前にデバッグプリントを入れる様にした方が良いと思います。

投稿2015/07/21 00:34

編集2015/07/21 03:25
eripong

総合スコア1546

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

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

fire

2015/07/21 02:16

とても丁寧な回答ありがとうございます。 おっしゃるとおり簡略化したコードが間違いでコンパイルエラーが通らなかったのははじめクラスを分けてコードを書いていたのに途中で一本にまとめたときに指定したメソッドが旧クラスのままだったためコンパイルエラーも通らずおかしなままでした。しかし簡略化したコードでもメソッドなのに呼び出してないのはおかしかったです。的確なご指摘ありがとうございます。 昨晩そのことに気づきコードを修正したのですがこちらのページに修正する前に寝落ちしてしまいました。回答してくださったのに質問の入れ違いになり大変申しわけございません。もしお時間よろしければ(修正後今だキータイプできない)コード全文記載したので読みづらいかと思いますが回答いただけたらうれしいです。
eripong

2015/07/21 02:58

なるほど、そうでしたか。 全文記載されたコードに対しての回答を追記しました。
fire

2015/07/21 03:12

迅速で分かりやすい回答ありがとうございます! 当該箇所が明快に解決しました。二度の質問に答えていただきありがとうございました。 デバッガなども初めて知ったので自分の検索解決力をあげて出直してきます。
eripong

2015/07/21 03:29

がんばってください。 もし、使っていない様なら、 EclipseやNetBeansなど使うようにすると、 デバッガなどが使いやすくなると思います。 import文も、自分で書く必要があまりなくなりますし、 コードの整形もしてくれます。
guest

0

Typed→keyTypedでは?コンパイルエラーが出ないのは謎ですが

投稿2015/07/20 15:58

swordone

総合スコア20651

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

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

fire

2015/07/20 16:05

すばやい回答ありがとうございます。申し訳ございません質問のコードを簡略化する時に誤って消してしまいTypedと書き質問しましたがkeyTypedとうっておりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問