public class MyPanel extends JPanel implements KeyListener {
private char c = 'e';
public MyPanel() {
this.setPreferredSize(new Dimension(500,500));
addKeyListener(this);
}
public void paintComponent(Graphics g) {
super.repaint();
g.drawString("the key that pressed is" + c, 250,250);
}
public void keyPressed(KeyEvent e) {
c=e.getKeyChar();
repaint();
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
c=e.getKeyChar();
repaint();
}
public static void main(String[] s) {
JFrame f=new JFrame();
f.getContentPane().add(new MyPanel());
f.pack();
f.setVisible(true);
}
}
私は this を読んでみましたが、KeyListenerを単純に実装する方法を理解することはできませんでした。では、これを機能させるには何を変更する必要がありますか?
それが機能しない理由は次のとおりです。
JPanel
にはキーボードフォーカスがありません。 (フレームにはそれがあります。)パネルが画面に追加されたら、おそらくrequestFocus
したいと思うでしょう。
グラフィックを変更する必要がある場合は、repaint
を呼び出す必要があります。
repaint
メソッドでpaintComponent
を呼び出さないでください。
文字列を再度描画する前に、描画領域をクリアする必要があります(そうしないと、すべての文字が重なり合うことになります)。
これが完全な実例です:
_class MyPanel extends JPanel implements KeyListener {
private char c = 'e';
public MyPanel() {
this.setPreferredSize(new Dimension(500, 500));
addKeyListener(this);
}
public void addNotify() {
super.addNotify();
requestFocus();
}
public void paintComponent(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
g.drawString("the key that pressed is " + c, 250, 250);
}
public void keyPressed(KeyEvent e) { }
public void keyReleased(KeyEvent e) { }
public void keyTyped(KeyEvent e) {
c = e.getKeyChar();
repaint();
}
public static void main(String[] s) {
JFrame f = new JFrame();
f.getContentPane().add(new MyPanel());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
_
ああ、ウィンドウを閉じたときにアプリケーションを終了させるためにf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
を追加することもできます。 :-)