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

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

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

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

Q&A

解決済

1回答

933閲覧

【Java】キー入力を受けつけてくれません。

uq_pg

総合スコア5

Java

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

1グッド

0クリップ

投稿2022/10/09 11:41

編集2022/10/10 02:18

Javaに関する質問です。

https://www.youtube.com/watch?v=K7EZ3q-w5mE&t=0s

上記の動画通りにコードを書き写したのですが
VSCode上で実行すると画面は表示されるのですが、十字キーやスペースキーの入力を受けつけてくれませんでした。

eclipseでは自動でimportされる機能があるらしいのですが、VSCodeには無い為、自分で必要なクラス等をインポートしました。
作成したTitilePanel.javaを貼りますのでどこが間違っているのか教えていただけると助かります。

Java

1package sample02_2_ScreenChange02; 2 3import java.awt.Color; 4import java.awt.Font; 5import java.awt.event.KeyEvent; 6import java.awt.event.KeyListener; 7 8import javax.swing.JLabel; 9import javax.swing.JPanel; 10import javax.swing.border.Border; 11import javax.swing.BorderFactory; 12import javax.swing.SwingConstants; 13 14public class TitlePanel extends JPanel { 15 private static final long serialVersionUID = 1L; 16 //コンポーネント 17 JLabel title; 18 JLabel start; 19 JLabel exit; 20 JLabel select; 21 JLabel message; 22 Menu checkMenu = Menu.START; 23 Border border = BorderFactory.createLineBorder(Color.BLACK,2); //いらなければ消す 24 MyKeyListener myKeyListener; 25 26 public enum Menu { 27 START, 28 EXIT, 29 } 30 31 //コンストラクタ 32 TitlePanel() { 33 this.setLayout(null); //レイアウトの設定 34 this.setBackground(Color.cyan); //背景の色 35 } 36 // コンストラクタが呼ばれた後手動で呼び出す 37 public void prepareComponents() { 38 //タイトルロゴ 39 title= new JLabel(); 40 // ImageIcon titleLogo = new ImageIcon(getClass().getClassLoader().getResource("title.png")); 41 //600×300の画像を想定 42 //title.setIcon(titleLogo); 43 title.setHorizontalAlignment(SwingConstants.CENTER); 44 title.setVerticalAlignment(SwingConstants.BOTTOM); 45 title.setText("Created by 【YOUR NAME】"); 46 title.setHorizontalTextPosition(SwingConstants.CENTER); 47 title.setVerticalTextPosition(SwingConstants.BOTTOM); 48 title.setBounds(90,0,600,350); 49 title.setBorder(border); //縁取り(いらなければ消す) 50 51 start = new JLabel(); 52 start.setText("START"); 53 start.setFont(new Font("MV boli",Font.BOLD,40)); 54 start.setHorizontalTextPosition(JLabel.CENTER); 55 start.setVerticalTextPosition(JLabel.BOTTOM); 56 start.setBounds(330,400,150,40); 57 start.setBorder(border); //縁取り(いらなければ消す) 58 59 exit = new JLabel(); 60 exit.setText("EXIT"); 61 exit.setFont(new Font("MV boli",Font.BOLD,40)); 62 exit.setHorizontalTextPosition(JLabel.CENTER); 63 exit.setVerticalTextPosition(JLabel.BOTTOM); 64 exit.setBounds(350,450,110,40); 65 exit.setBorder(border); //縁取り(いらなければ消す) 66 67 select = new JLabel(); 68 // ImageIcon icon02 = new ImageIcon(getClass().getClassLoader().getResource("nikukyu_shirocha_small.png")); 69 // select.setIcon(Icon02); 70 select.setBackground(Color.blue); 71 select.setOpaque(true); 72 select.setBounds(280,400,40,40); 73 select.setBorder(border); //縁取り(いらなければ消す) 74 75 //説明 76 message = new JLabel(); 77 message.setHorizontalAlignment(SwingConstants.CENTER); 78 message.setText("選択:↑,↓  決定:SPACE"); 79 message.setVerticalTextPosition(JLabel.CENTER); 80 message.setHorizontalTextPosition(JLabel.CENTER); 81 message.setBounds(249,517,300,30); 82 message.setBorder(border); //縁取り(いらなければ消す) 83 84 //配置 85 this.setLayout(null); 86 this.add(title); 87 this.add(start); 88 this.add(exit); 89 this.add(select); 90 this.add(message); 91 92 //リスナーの設定 93 myKeyListener = new MyKeyListener(this); 94 95 } 96 97 private class MyKeyListener implements KeyListener { 98 //貼り付け先を保持 99 TitlePanel panel; 100 101 //コンストラクタ 102 MyKeyListener(TitlePanel p) { 103 super(); 104 panel = p; 105 panel.addKeyListener(this); 106 } 107 108 @Override 109 public void keyTyped(KeyEvent e) { 110 // do nothing 111 } 112 113 @Override 114 public void keyReleased(KeyEvent e) { 115 // do nothing 116 } 117 118 @Override 119 public void keyPressed(KeyEvent e) { 120 switch(e.getKeyCode()) { 121 case KeyEvent.VK_DOWN: //下を押した場合 122 if(checkMenu == Menu.START) { 123 select.setLocation(select.getX(),select.getY()+50); 124 checkMenu = Menu.EXIT; 125 } 126 break; 127 128 case KeyEvent.VK_UP: //上を押した場合 129 if(checkMenu == Menu.EXIT) { 130 select.setLocation(select.getX(),select.getY()-50); 131 checkMenu = Menu.START; 132 } 133 break; 134 135 case KeyEvent.VK_SPACE: //スペースキーを押した場合 136 if(checkMenu == Menu.START) { 137 //開始 138 Main.mainWindow.setFrontScreenAndFocus(ScreenMode.GAME); 139 } 140 else if(checkMenu == Menu.EXIT) { 141 //終了 142 System.exit(0); 143 } 144 break; 145 } 146 } 147 } 148}

ソースコードの書き方を教えてくださった方がいたため、修正しました。
ありがとうございました。

TN8001👍を押しています

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

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

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

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

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

jimbe

2022/10/09 14:15 編集

コードは「コードのマークダウン」で囲ってください。 マークダウンに付きましてはヘルプを参照してください。 各キーを押した時、MyKeyListener が呼ばれているのか、呼ばれている場合はどのようなパラメータになっているのか等を調査して教えて頂けますか。
TN8001

2022/10/09 14:17

TitilePanel.javaはあってると思います。 MainWindow.javaがどこか違うんじゃないでしょうか? (検証のために書き起こしましたが、今時GitHubかなんかに完成版をあげといて欲しいですなw
uq_pg

2022/10/09 15:05

MainWindow.javaを確認したところ、titlePanel.requestFocus(); にすべきところがgamePanel.requestFocus();になっていました。 初歩的なミスで申し訳ありませんでした。 TN8001さん、ありがとうございました。 jimbeさんもご協力ありがとうございました。
uq_pg

2022/10/09 15:11

回答を参考に勉強します。 本当にありがとうございました!
uq_pg

2022/10/10 02:21

コードのマークダウンについて修正しました。 参考も非常に分かりやすく助かりました。 m.ts10806さん、ありがとうございました。 次の質問の機会にはコードのマークダウンをしてから質問します!
guest

回答1

0

ベストアンサー

キー入力はフォーカスの当たっているコンポーネントが受け取ります。
JPanel にフォーカスが当たっていれば、その JPanel にキーイベントが通知されることになりますが、通常入力フィールドやボタンにフォーカスが当たる為、 JPanel でキー処理を行う為にはフォーカスがいつ当たるか、当たっているかを常に考える必要があります。
以下のコードは JPanel 以外に無いので、JPanel でキー入力を受け取れています。

java

1import java.awt.event.KeyEvent; 2import java.awt.event.KeyListener; 3 4import javax.swing.*; 5 6public class MainFrame extends JFrame { 7 public static void main(String[] args) { 8 SwingUtilities.invokeLater(() -> new MainFrame().setVisible(true)); 9 } 10 MainFrame() { 11 super("タイトル"); 12 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 13 setSize(320, 200); 14 setLocationRelativeTo(null); 15 16 add(new MainPanel()); 17 } 18 19 private static class MainPanel extends JPanel { 20 MainPanel() { 21 super(null); 22 setFocusable(true); 23 requestFocus(); 24 addKeyListener(new KeyListener() { 25 @Override 26 public void keyTyped(KeyEvent e) {} //ignore 27 @Override 28 public void keyPressed(KeyEvent e) { 29 System.out.println("keyPressed: e.getKeyCode()=" + e.getKeyCode()); 30 } 31 @Override 32 public void keyReleased(KeyEvent e) {} //ignore 33 }); 34 } 35 } 36}

投稿2022/10/09 14:52

jimbe

総合スコア12632

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問