KeyListener不起作用

时间:2016-11-23 09:34:40

标签: java keylistener

我有以下两个类,主类(SamG)和Panll类。我已经在Panll类中实现了KeyListener,但它似乎不起作用。

public class SamG {
    public static void main(String[] args) {
        JFrame jf = new JFrame("My APP");
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(800, 400);
        jf.setVisible(true);
        jf.pack();
        jf.setContentPane(new Panll());
    }   
}

public class Panll extends JPanel implements KeyListener {
    int x=100,y=100;
    boolean run=true;
    Panll() {
        addKeyListener(this);
    }

    @Override
    public void paint (Graphics g) {
        super.repaint();
        g.clearRect(0, 0, 800, 400);
        update();
        draw(g);
        try {
            Thread.sleep(17);
        } catch (InterruptedException ex) {
            Logger.getLogger(Panll.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void update(){
        x++;
        y++;
    }

    public void draw(Graphics g){
        g.drawOval(x, y, 100, 100);
    }

    @Override
    public void keyTyped(KeyEvent e) {           
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println(e.getKeyChar());
    }

    @Override
    public void keyReleased(KeyEvent e) {    
    }
}

2 个答案:

答案 0 :(得分:0)

您无法在没有明确允许setFocusable(true);的情况下关注JPanel。如果添加此行,您可以将注意力集中在JPanel上。如果您按下任何按钮,KeyListener就可以正常工作

答案 1 :(得分:0)

首先永远不会将主线程发送到睡眠状态。创建一个新的线程,定期调用面板的重绘。
第二次不使用paint()方法来绘制您的内容。请改用paintComponent()方法 第三次将您的KeyListener添加到JFrame。您的JPanel未获得KeyEvents,因为它永远不会获得焦点。