2016-12-24 49 views
0

我想同时移动两个对象。 我想为此使用线程。但它在运行方法中出现错误。 我该怎么做? 如何使用键盘事件来做到这一点 就像2人游戏一样?使用带线程的KeyListener

下面的代码:

public class First extends JPanel implements Runnable,KeyListener{ 
    int y1=303/2; 
    private int vy=0; 

    public void paintComponent(Graphics g){ 
     g.setColor(Color.BLUE); 
     g.fillRect(10,y1, 15, 20); 
    } 

    public void setVelocity(int v){ 
     vy=v; 

    } 

    @Override 
    public void run() { 
     int keyCode=e.getKeyCode(); 
     if(keyCode==KeyEvent.VK_UP){ 

     } 
     if(keyCode==KeyEvent.VK_S){ 

     } 

     else if(keyCode==KeyEvent.VK_DOWN){ 

     } 
     else if(keyCode==KeyEvent.VK_W){ 

     } 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } 
    } 
    public static void main(String[] args){ 
     JFrame jf=new JFrame(); 
     Panel p=new Panel(); 
     jf.add(p); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     jf.setSize(300,300); 
     jf.setVisible(true); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 

    } 

    @Override 
    public void keyPressed(KeyEvent e) { 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 

    } 
} 

class Second extends JPanel{ 
    int y2=303/2; 
    private int vy=0; 

    public void setVelocity(int v){ 
     vy=v; 

    } 

    @Override 
    public void paintComponent(Graphics g){ 
     g.setColor(Color.YELLOW); 
     g.fillRect(150,y2, 15, 20); 
    } 

} 

class Panel extends JPanel{ 
    First f=new First(); 
    Second s=new Second(); 
    public void paintComponent(Graphics g){ 
     s.paintComponent(g); 
     f.paintComponent(g); 
    } 
} 
+1

什么错误?发布堆栈跟踪 – GurV

+0

run方法中的'e'也会引发错误 – Rslnn

+0

如何使用Thread移动两个对象? – Rslnn

回答

1

我怎样才能做到这一点使用键盘的事件,如2人游戏?

只有最后一个键被按下才会生成一个事件,所以基本上你需要跟踪所有按下的键(以及它们何时被释放)。

我已经在过去使用Key BindingsSwing Timer

查看Motion Using the Keyboard中的KeyboardAnimation示例,了解此方法的工作示例。

该链接还将解释什么是Key Bindings以及它们为什么应该优先于KeyListener。