web-dev-qa-db-ja.com

KeyListenerを簡単に実装する方法は?

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を単純に実装する方法を理解することはできませんでした。では、これを機能させるには何を変更する必要がありますか?

6
Ofek Ron

それが機能しない理由は次のとおりです。

  1. JPanelにはキーボードフォーカスがありません。 (フレームにはそれがあります。)パネルが画面に追加されたら、おそらくrequestFocusしたいと思うでしょう。

  2. グラフィックを変更する必要がある場合は、repaintを呼び出す必要があります。

  3. repaintメソッドでpaintComponentを呼び出さないでください。

  4. 文字列を再度描画する前に、描画領域をクリアする必要があります(そうしないと、すべての文字が重なり合うことになります)。

これが完全な実例です:

_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)を追加することもできます。 :-)

10
aioobe