Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不同的线程中使用keylistener?_Java_Multithreading - Fatal编程技术网

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

Java 如何在不同的线程中使用keylistener?,java,multithreading,Java,Multithreading,我想在不同的线程中进行输入操作,我应该在run方法中写入什么?或者这是一种更好的方法 public class Player implements Runnable, KeyListener{ int speed; public Player() { speed = 0; } @Override public void run() { //what should i write here

我想在不同的线程中进行输入操作,我应该在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循环,然后以某种方式将这些函数放入其中

我认为你的设计是“颠倒”的

首先,用户界面事件总是由您自己决定

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

意思是:你应该已经使用了一些其他的“游戏控制器线程”。在该线程中运行的代码只检查
speed
字段的值;并利用这一点


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

除非有理由不这样做,否则应该使用
计时器而不是线程@Radiodef,但它会在主线程中,不是吗?