【问题标题】:KeyListener doesn't workKeyListener 不起作用
【发布时间】:2016-11-25 19:48:35
【问题描述】:

我有以下两个类,主类(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) {    
    }
}

【问题讨论】:

标签: java keylistener


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 2012-01-28
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多