2016-11-23 129 views
0

我有以下两个类,主类(SamG)和Panll类。我已经在Panll类中实现了KeyListener,但它似乎不起作用。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) {  
    } 
} 
+0

你的问题不是很清楚。检查这个http://stackoverflow.com/help/mcve – grsdev7

回答

0

如果没有明确允许它与setFocusable(true);,你不能集中一个JPanel。如果您添加此行,您可以将注意力集中在JPanel上。如果您然后按任何按钮的KeyListener工作就好了

0

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