前提・実現したいこと
現在一つのJFrame
の中に二つのJPanel
を入れ片方には矢印キーを押すこと(KeyListener
)で画像が矢印に沿って動き、もう片方には特に何もないただのJPanel
になっています。この時は問題なく矢印キーを入力すると画像が動きますが、もう一つのJPanel
の方にJButton
を設置し、ボタンを押すと(ActionListener
)文字が表示されるようにすると、JButton
のボタンを押すと文字は出てくれるのですが、矢印キーを押しても画像が動きません。
これは一つのクラスでimplements KeyListener, ActionListener
を使って、二つ実装しています。
なんでボタンは反応してくれているのに、キーは反応してくれないのか教えてください。
一応考えたのが、「JButton
を選択しているため、KeyListener
が反応しない」というものですが、もしこれであれば直し方を教えてください。
下の例はキーを押すとを色が変わるように変更したものです。
add(p2);
を抜いて実行すると色が変わりますが、add(p2);
を抜かずに実行すると反応しません。その代わりJButton
が反応するようになります。
ソースコード
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Game extends JFrame implements KeyListener, ActionListener{ public static void main(String[] args){ Game cl = new Game(); cl.setVisible(true); } JPanel p1; Game(){ setTitle("Game"); setSize(214,437);//200+14,400+37 setResizable(false); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setAlwaysOnTop(true);//常に前面 setLayout(null); p1 = new JPanel(); p1.setBounds(0,0,200,200); p1.setBackground(Color.WHITE); JPanel p2 = new JPanel(); p2.setBounds(0,200,200,200); p2.setLayout(new GridLayout(1,2)); JButton[] btn = new JButton[2]; for(int i=0;i<2;i++){ btn[i] = new JButton(String.valueOf(i)); btn[i].addActionListener(this); btn[i].setActionCommand(String.valueOf(i)); p2.add(btn[i]); } add(p1); add(p2); addKeyListener(this); } @Override public void actionPerformed(ActionEvent e) { System.out.println("JButtonが押されました"); } @Override public void keyTyped(KeyEvent e){} @Override public void keyPressed(KeyEvent e){/*キーを入力した際の処理*/ p1.setBackground(Color.BLACK); System.out.println("Keyが押されました"); } @Override public void keyReleased(KeyEvent e){} }
補足情報(FW/ツールのバージョンなど)
java version "16.0.1" 2021-04-20
Java(TM) SE Runtime Environment (build 16.0.1+9-24)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)
回答1件
あなたの回答
tips
プレビュー