javaによりトランプのスピードを一人で行うゲームのguiを描くに当たってキーボード操作によるイベントリスナーであるキーリスナーを用いたいのですがgui画面のみ表示され、コンパイルエラーが出ずにキー操作への反応がなされません。
keyTyped直下の操作
System.out.println("テスト");
もききません。
稚拙な質問ですがご教授お願いいたします。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Speed extends JPanel implements KeyListener {
// 場、山、自陣a[4]に入れるカードを配列として用意する。
public static int[] a = new int[4], yama = new int[56], ba = new int[53];
public static int counterYAMA = 0, counterBA = 0, counterHOJU = 0;
public Speed() {
// 山に入るカードをシャッフルし配列として格納する。
int i;
for (i = 0; i < 52; i++)
yama[i] = i + 1;
for (i = 51; i > 0; i--) {
int r = (int) (Math.random() * 52) + 1;
int t = yama[r];
yama[r] = yama[i];
yama[i] = t;
}
for (i = 0; i < 4; i++)
a[i] = yama[i];
counterYAMA = 4;
yama[52]=-1;
yama[53]=-1; //この三つは最後カードがなくなったときの表示として使う。
yama[54]=-1;
// gui部分。
//アイコンに数字とスートをあてはめる。
int a0 = a[0] % 13 + 1;
int a1 = a[1] % 13 + 1;
int a2 = a[2] % 13 + 1;
int a3 = a[3] % 13 + 1;
int nba = ba[counterBA] % 13 + 1;
String suit0 = null, suit1 = null, suit2 = null, suit3 = null, suitBA = null;
if (a[0] < 14)
suit0 = "c";
else if (a[0] < 27)
suit0 = "d";
else if (a[0] < 40)
suit0 = "h";
else if (a[0] < 53)
suit0 = "s";
if (a[1] < 14)
suit1 = "c";
else if (a[1] < 27)
suit1 = "d";
else if (a[1] < 40)
suit1 = "h";
else if (a[1] < 53)
suit1 = "s";
if (a[2] < 14)
suit2 = "c";
else if (a[2] < 27)
suit2 = "d";
else if (a[2] < 40)
suit2 = "h";
else if (a[2] < 53)
suit2 = "s";
if (a[3] < 14)
suit3 = "c";
else if (a[3] < 27)
suit3 = "d";
else if (a[3] < 40)
suit3 = "h";
else if (a[3] < 53)
suit3 = "s";
if (counterBA > 0){
if (ba[counterBA] < 14)
suitBA = "c";
else if (ba[counterBA] < 27)
suitBA = "d";
else if (ba[counterBA] < 40)
suitBA = "h";
else if (ba[counterBA] < 53)
suitBA = "s";
}
Icon man1 = null,man2 = null,man3 = null,man4 = null,iba = null,iyama = null;
if (a[0] > 0)
man1 = new ImageIcon(String.format("%s%02d.gif", suit0, a0));
else
man1 = new ImageIcon("z01.gif");
if (a[1] > 0)
man2 = new ImageIcon(String.format("%s%02d.gif", suit1, a1));
else
man2 = new ImageIcon("z01.gif");
if (a[2] > 0)
man3 = new ImageIcon(String.format("%s%02d.gif", suit2, a2));
else
man3 = new ImageIcon("z01.gif");
if (a[3] > 0)
man4 = new ImageIcon(String.format("%s%02d.gif", suit3, a3));
else
man4 = new ImageIcon("z01.gif");
if (0 < counterBA && counterBA < 52)
iba = new ImageIcon(String.format("%s%02d.gif", suitBA, nba));
if (counterYAMA < 52)
iyama = new ImageIcon("z01.gif");
//パネルの配置。
JPanel p1,p2;
JButton b1, b2, b3, b4, b5, b6,b7;
p1 = new JPanel();
p2 = new JPanel();
b1 = new JButton(man1);
b2 = new JButton(man2);
b3 = new JButton(man3);
b4 = new JButton(man4);
if (counterBA == 0)
b5 = new JButton("sボタンでゲーム開始だよ!");
else if (counterBA == 52){
b5 = new JButton(String.format("finish!!\n%d回補充したね!", counterHOJU-1));
System.out.println("finish!!\n"+ (counterHOJU - 1) +"回補充したね!");
}
else
b5 = new JButton(iba);
b6 = new JButton("←場 山→");
if (counterYAMA == 52)
b7 = new JButton("ラストスパート!");
else
b7 = new JButton(iyama);
p1.setLayout(new BoxLayout(p1,BoxLayout.X_AXIS));
p1.add(b1);
p1.add(b2);
p1.add(b3);
p1.add(b4);
p2.setLayout(new BoxLayout(p2,BoxLayout.X_AXIS));
p2.add(b5);
p2.add(b6);
p2.add(b7);
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(p2);
add(p1);
setFocusable(true);
addKeyListener(this);
// ゲーム開始!
}
public void keyTyped(KeyEvent e) {
int key = e.getKeyCode();
if (key == 's') {
System.out.println("sのキーが押された.山から場へ");
ba[counterBA] = yama[counterYAMA];
counterBA++;
counterYAMA++;
counterHOJU++;
System.out.println("場" + ba[counterBA] + " 山" + yama[counterYAMA] + "\n\n自陣" + a[0] + " " + a[1] + " "
+ a[2] + " " + a[3]);
} else if (key == 'h') {
System.out.println("hのキーが押された");
ba[counterBA] = a[0];
counterBA++;
if (counterYAMA < 52) {
a[0] = yama[counterYAMA];
counterYAMA++;
}
System.out.println("場" + ba[counterBA] + " 山" + yama[counterYAMA] + "\n\n自陣" + a[0] + " " + a[1] + " "
+ a[2] + " " + a[3]);
} else if (key == 'j') {
System.out.println("jのキーが押された");
ba[counterBA] = a[1];
counterBA++;
if (counterYAMA < 52) {
a[1] = yama[counterYAMA];
counterYAMA++;
}
System.out.println("場" + ba[counterBA] + " 山" + yama[counterYAMA] + "\n\n自陣" + a[0] + " " + a[1] + " "
+ a[2] + " " + a[3]);
} else if (key == 'k') {
System.out.println("kのキーが押された");
ba[counterBA] = a[2];
counterBA++;
if (counterYAMA < 52) {
a[2] = yama[counterYAMA];
counterYAMA++;
}
System.out.println("場" + ba[counterBA] + " 山" + yama[counterYAMA] + "\n\n自陣" + a[0] + " " + a[1] + " "
+ a[2] + " " + a[3]);
} else if (key == 'l') {
System.out.println("lのキーが押された");
ba[counterBA] = a[3];
counterBA++;
if (counterYAMA < 52) {
a[3] = yama[counterYAMA];
counterYAMA++;
}
System.out.println("場" + ba[counterBA] + " 山" + yama[counterYAMA] + "\n\n自陣" + a[0] + " " + a[1] + " "
+ a[2] + " " + a[3]);
}
repaint();
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public static void main(String[] args) {
JFrame Speedframe = new JFrame("JPanel");
Speedframe.setBackground(Color.CYAN);
Speedframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Speed s = new Speed();
Speedframe.add(s, BorderLayout.CENTER);
Speedframe.pack();
Speedframe.setVisible(true);
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
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();
)ブレークポイントを入れるか、
それより前にデバッグプリントを入れる様にした方が良いと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2015/07/21 11:16
おっしゃるとおり簡略化したコードが間違いでコンパイルエラーが通らなかったのははじめクラスを分けてコードを書いていたのに途中で一本にまとめたときに指定したメソッドが旧クラスのままだったためコンパイルエラーも通らずおかしなままでした。しかし簡略化したコードでもメソッドなのに呼び出してないのはおかしかったです。的確なご指摘ありがとうございます。
昨晩そのことに気づきコードを修正したのですがこちらのページに修正する前に寝落ちしてしまいました。回答してくださったのに質問の入れ違いになり大変申しわけございません。もしお時間よろしければ(修正後今だキータイプできない)コード全文記載したので読みづらいかと思いますが回答いただけたらうれしいです。
2015/07/21 11:58
全文記載されたコードに対しての回答を追記しました。
2015/07/21 12:12
当該箇所が明快に解決しました。二度の質問に答えていただきありがとうございました。
デバッガなども初めて知ったので自分の検索解決力をあげて出直してきます。
2015/07/21 12:29
もし、使っていない様なら、
EclipseやNetBeansなど使うようにすると、
デバッガなどが使いやすくなると思います。
import文も、自分で書く必要があまりなくなりますし、
コードの整形もしてくれます。