如何在不同的线程中使用keylistener?

时间:2017-05-23 14:36:20

标签: java multithreading

我想在不同的线程中输入操作,我应该写入run方法?或者可能是更好的方法吗?

public class Player implements Runnable, KeyListener{

    int speed;

    public Player() 
    {
        speed = 0;
    }

    @Override
    public void run()
    {       
        //what should i write here?
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyPressed(KeyEvent e) 
    {
        startMove(e);
    }

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


       public void startMove(KeyEvent e)
    {        
        int key = e.getKeyCode();

        switch (key) {
            case KeyEvent.VK_W:
                speed = 2;
                break;
            case KeyEvent.VK_S:
                speed = -2;
                break;
            default:
                break;
        }
    }

    public void endMove(KeyEvent e)
    {
        int key = e.getKeyCode();

        if(key == KeyEvent.VK_W)
            speed = 0; 
        if(key == KeyEvent.VK_S)
            speed = 0;

    }   
}

此代码应检测键事件,然后依赖于键代码调用startMove()或endMove()函数。而这一切都应该在同一个线程中。我应该使用while循环运行然后以某种方式放置功能?

1 个答案:

答案 0 :(得分:0)

我认为你的设计是“好转”。

首先,在AWT event dispatcher thread中,UI事件始终归结为您。

您的代码正在做什么:更改某些Player对象的速度。哪里需要另一个线程?

含义:你应该已经使用了其他一些“游戏控制器线程”。在该线程中运行的代码只需检查'%'字段的值;并利用它。

核心是:你的开始/结束方法只是改变一个字段;那很好。你应该保持这种方式。并且根据这些鼠标事件改变的速度,在该类之外的其他代码“做它的事情”。