KeyListener与Thread一起使用

时间:2016-12-24 10:49:15

标签: java multithreading swing keylistener

我想同时移动两个对象。 我想为此使用Thread。但它在run方法中给出了错误。 我怎样才能做到这一点? 如何使用键盘事件执行此操作 喜欢2人游戏吗?

以下是代码:

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 个答案:

答案 0 :(得分:1)

  

如何使用键盘事件,如2人游戏?

仅为按下的最后一个键生成一个事件,因此基本上您需要跟踪所有按下的键(以及它们被释放时)。

我过去使用Key BindingsSwing Timer完成了此操作。

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

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