【问题标题】:how to simply implement a KeyListener?如何简单地实现一个 KeyListener?
【发布时间】:2012-03-09 04:26:15
【问题描述】:
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。那么我需要改变什么才能让它工作?

【问题讨论】:

  • 您希望工作程序有什么行为?如果您想在用户每次按键时更改屏幕上的字符串,在每次修改 c 后简单地调用 repaint() 就可以了。
  • 是的,我忘了添加它,但无论如何它都不起作用......

标签: java swing keylistener


【解决方案1】:

以下是它不起作用的原因:

  1. JPanel 没有键盘焦点。 (框架有它。)当面板添加到屏幕时,您可能想要requestFocus

  2. 当图形发生变化时,您需要调用repaint

  3. 你不能在paintComponent方法中调用repaint

  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) 以使应用程序在您关闭窗口时终止。 :-)

【讨论】:

  • 这就是我所说的好榜样!!
猜你喜欢
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2017-10-06
相关资源
最近更新 更多