如何简单地实现KeyListener

如何简单地实现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);
    }
}
我尝试阅读ojita,但仍无法理解如何简单地实现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)以使应用程序在关闭窗口时终止。 :-)

    关于java - 如何简单地实现KeyListener?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9333876/

    10-15 21:55