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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

1160閲覧

ボタンを押した後のKeyEventの取得がうまくいかない

etcetera

総合スコア24

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2021/02/13 09:45

編集2021/02/13 11:31

現在ゲームの枠組みを作っています。MainPanelを用意し、そこにstartpanelやgamepanel,gameclearpanelなどをMainpanel上で入れ替えるといったプログラムを作りたいと思っています。初めはMainpanelにはstartpanelが載せられており、「s」キーを押すとゲームがスタートしてgemapanelに行くようになっているのですが、StartPanelに設置した「遊び方」のボタン(押すと標準出力に遊び方と表示される。)を押すとkeyEventが取得されず、sキーを押してもゲームが始まらなくなってしまいます。原因がわかる方がいましたら、解決策を教えてください。

java

1//GameFrame ファイル 2import javax.swing.JFrame; 3 4public class GameFrame extends JFrame { 5 6 public GameFrame() { 7 8 setLayout(null); 9 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 10 setSize(500,500); 11 setLocationRelativeTo(null); 12 MainPanel pn =new MainPanel(); 13 add(pn); 14 setVisible(true); 15 16 } 17 18 public static void main(String[] args) { 19 GameFrame GF=new GameFrame(); 20 21 22 23 } 24 25} 26

java

1//StartPanelファイル 2import java.awt.Color; 3import java.awt.Font; 4import java.awt.FontMetrics; 5import java.awt.Graphics; 6import java.awt.event.ActionEvent; 7import java.awt.event.ActionListener; 8import java.awt.event.KeyAdapter; 9import java.awt.event.KeyEvent; 10 11import javax.swing.JButton; 12import javax.swing.JPanel; 13 14public class StartPanel extends JPanel implements ActionListener{ 15 boolean in_game=true; 16 MainPanel mp; 17 JButton bt; 18 19 public StartPanel(MainPanel mp1) { 20 21 mp=mp1; 22 setLayout(null); 23 setBackground(Color.white); 24 Font f=new Font("SansSerif",Font.BOLD,20); 25 FontMetrics fm=getFontMetrics(f); 26 String str="遊び方"; 27 int w=fm.stringWidth(str)+50; 28 int h=fm.getHeight()+20; 29 bt=new JButton(str); 30 bt.setFont(f); 31 bt.addActionListener(this); 32 bt.setSize(w,h); 33 bt.setLocation(250-w/2,400); 34 add(bt); 35 addKeyListener(new Key()); 36 setFocusable(true); 37 38 39 40 } 41 @Override 42 public void paint(Graphics g) { 43 super.paint(g); 44 FontMetrics fm; 45 Font f; 46 String str1,str="Game Title"; 47 int w,h; 48 49 f=new Font("Serif",Font.BOLD,25); 50 fm=g.getFontMetrics(f); 51 str1=str+"(Serif)"; 52 w=fm.stringWidth(str1); 53 h=fm.getHeight(); 54 g.setFont(f); 55 g.drawString(str1,250-w/2,h); 56 57 f=new Font("SansSerif",Font.BOLD,25); 58 fm=g.getFontMetrics(f); 59 str1=str+"(SansSerif)"; 60 w=fm.stringWidth(str1); 61 h=h+fm.getHeight()+10; 62 g.setFont(f); 63 g.drawString(str1,250-w/2,h); 64 65 66 f=new Font("Dialog",Font.BOLD,25); 67 fm=g.getFontMetrics(f); 68 str1=str+"(Dialog)"; 69 w=fm.stringWidth(str1); 70 h=h+fm.getHeight()+10; 71 g.setFont(f); 72 g.drawString(str1,250-w/2,h); 73 74 f=new Font("DialogInput",Font.BOLD,25); 75 fm=g.getFontMetrics(f); 76 str1=str+"(DialogInput)"; 77 w=fm.stringWidth(str1); 78 h=h+fm.getHeight()+10; 79 g.setFont(f); 80 g.drawString(str1,250-w/2,h); 81 82 f=new Font("Serif",Font.PLAIN,20); 83 fm=g.getFontMetrics(f); 84 str1="ゲーム開始: 「s」キー"; 85 w=fm.stringWidth(str1); 86 h=500-fm.getHeight()-10; 87 g.setFont(f); 88 g.drawString(str1,250-w/2,h-200); 89 //requestFocusInWindow(); 90 91 92 93 94 95 } 96 97 public void actionPerformed(ActionEvent e) { 98 if(e.getSource()==bt) { 99 System.out.println("遊び方"); 100 } 101 } 102 103 class Key extends KeyAdapter{ 104 105 public void keyPressed(KeyEvent ke) { 106 if(ke.getKeyCode()==KeyEvent.VK_S) { 107 mp.state=1; 108 109 } 110 } 111 } 112 113} 114

java

1//MainPanel ファイル 2import java.awt.BorderLayout; 3 4import javax.swing.JPanel; 5 6public class MainPanel extends JPanel implements Runnable { 7 StartPanel sp; 8 GamePanel gp; 9 GameClearPanel gcp; 10 GameOverPanel gop; 11 boolean in_game=true;//ゲーム実行中はtrue 12 public int state=0;//ゲーム状態 13 public int level=1;//ゲームレベル 14 int old_state=0;//直前のゲーム状態 15 Thread td; 16 int width=500; 17 int hight=500; 18 19 public MainPanel() { 20 21 setSize(width,hight); 22 setLayout(new BorderLayout()); 23 sp=new StartPanel(this); 24 add(sp,BorderLayout.CENTER); 25 td=new Thread(this); 26 td.start(); 27 28 } 29 30 public void run() { 31 while(in_game) { 32 try { 33 td.sleep(100); 34 }catch(InterruptedException e) {} 35 if(state!=old_state) { 36 if(old_state==0) { 37 remove(sp); 38 } 39 else if(old_state==1) { 40 remove(gp); 41 } 42 else if(old_state==2) { 43 remove(gcp); 44 } 45 else { 46 remove(gop); 47 } 48 49 //新しいパネルの追加 50 if (state==4) { 51 in_game=false; 52 }else if(state==0) { 53 sp=new StartPanel(this); 54 add(sp); 55 }else if(state==1) { 56 gp=new GamePanel(this); 57 add(gp); 58 } 59 else if(state==2) { 60 gcp=new GameClearPanel(this); 61 add(gcp); 62 } 63 else if(state==3){ 64 gop=new GameOverPanel(this); 65 add(gop); 66 } 67 validate(); 68 old_state=state; 69 } 70 } 71} 72}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/02/13 11:26 編集

どれ試そうかとったらコンパイルが通らないソースを貼るのは勘弁してください。 markdownのコード【```】で囲むのは、ソースファイル単位に区切ってください。 質問文の修正お願いします。
etcetera

2021/02/13 11:31

すみません、これでどうでしょうか?
退会済みユーザー

退会済みユーザー

2021/02/13 11:49

GameClearPanel GameOverPanel GameLanel を型に解決できません。 …とは出たんですが、今回はStartPanelのKey#keyPressed()に進めればいいと思うので、未定義エラーはコメントアウトします。 ってこれswingだからJDK8以前かな。今15使っているのでJDK入れ直して見てみますね。
guest

回答1

0

ベストアンサー

とりあえず遊び方ボタン押下後にキーイベントが取れない理由は

  • ① ボタンを押下したことにより、ボタンにフォーカスが移ってしまい
  • ② パネル側のキーイベントがボタンに吸われるようになってしまった

のが原因のようです。

対症療法的にボタンにもキーイベントを仕掛けると、
ボタン押下後もキーイベントを拾い続ける事が出来ました。
このコードは根本解決している訳ではないのでちゃんとした対策が必要かと思いますが、
後は etcetera さんがどう直すかだと思います。

java:StartPanel.java

1// ~(略)~ 2 3public StartPanel(MainPanel mp1) { 4 5 // ~(略)~ 6 7 String str="遊び方"; 8 int w=fm.stringWidth(str)+50; 9 int h=fm.getHeight()+20; 10 bt=new JButton(str); 11 bt.setFont(f); 12 bt.addActionListener(this); 13 bt.addKeyListener(new Key()); // これを追加 14 bt.setSize(w,h); 15 bt.setLocation(250-w/2,400); 16 17 add(bt); 18 addKeyListener(new Key()); 19 20 // ~(略)~ 21}

イメージ説明

頑張ってください。

投稿2021/02/13 13:04

編集2021/02/13 13:26
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

etcetera

2021/02/13 14:00

軽く調べてみましたが、この方法が一番手っ取り早そうなので、これでいきたいと思います。ありがとうございました。
m.ts10806

2021/02/14 00:11

そういう理由で採用した手法は大抵すぐこけます。 そのあたりも含めたアドバイスであることは認識されたほうが良いです>質問者さん
退会済みユーザー

退会済みユーザー

2021/02/14 01:10 編集

> etcetera さん 多分、この対症療法を採用した場合、今後コンポーネントを追加すると、追加したコンポーネント自身と、それ以外の操作する可能性のあるすべてのコンポーネントに追加でイベントを入れる必要が出てきます。 コンポーネント1つなら【1イベント】で済むけど、2つなら【4イベント】、3つなら【9イベント】と指数関数的に増えます。 他のゲーム画面にどれだけのコンポーネントがあるかは分かりませんが、ごくごく小規模なゲームを作るのが限界かと思います。リークの問題もありそうですし。 一つ鼻につくとしたら【軽く調べて~】の所ですが、 貴方のソースの書き方、swing系オブジェクトを格納した変数の状態、JDKソース、StackOverFlowなどのフォーラム、これらを総合的に見て【対症療法的】と私の経験と勘から言っている訳です。 私より調査、検証能力が高い人間に言われるならまだしも現時点で貴方が調べてたどり着けるとは思えません。 元々現象確認用のコードですしね。 初心者ごときが【本気で調べたって早々出てこない】です。んなもん頭で思ってても回答者に言わないで欲しいです。 失礼しました。 > m.ts10806さん 私が言いたい事を代弁して頂いてありがとうございます。 一度こけてみるのも勉強だと思うので良いかと思います。 仕事でこんなコード出して来たらキレますがw
m.ts10806

2021/02/14 02:52

採用理由からして、こけたときに回答者のせいにしそうだなと懸念しての指摘でした。 厚意の場所ですが回答者は基本無責任ですからね。 選んだ質問者自身の責任において十分検証してもらいたいもんです。手法ファーストでいくとすぐ詰まりますし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問