Java 正在尝试启动我的线程

Java 正在尝试启动我的线程,java,eclipse,multithreading,swing,keylistener,Java,Eclipse,Multithreading,Swing,Keylistener,首先,我知道我尝试读取输入的方式非常糟糕,但我尝试使用Keylistener,无论我尝试什么,它都不起作用。我不知道我做错了什么,所以这就是我目前正在尝试的。我试图从PreControls.java调用Controller.java中的线程。如果您能帮助我实现一个工作的keylistener,我将不胜感激,但我认为解决这个线程问题也会奏效。我试过调试它,但线程似乎没有启动 precontrolls.java中的代码: Controller C = new Controller(); C.star

首先,我知道我尝试读取输入的方式非常糟糕,但我尝试使用Keylistener,无论我尝试什么,它都不起作用。我不知道我做错了什么,所以这就是我目前正在尝试的。我试图从PreControls.java调用Controller.java中的线程。如果您能帮助我实现一个工作的keylistener,我将不胜感激,但我认为解决这个线程问题也会奏效。我试过调试它,但线程似乎没有启动

precontrolls.java中的代码:

Controller C = new Controller();
C.start();
System.out.print("Thread Should be started ");
Controller.java中的代码:

package Game;

public class Controller extends Thread {
    public void MyShipController(){
        System.out.print("Thread Is started ");
        String CharIn = "";
        while(SpaceInvaders.GameOn = true){
            CharIn = PreControls.ReadKeyPressed.getText();
            if(CharIn.equalsIgnoreCase("a")){
                SpaceInvaders.MyPos[0]--;
                System.out.print("Move Left ");
            }else if(CharIn.equalsIgnoreCase("d")){
                SpaceInvaders.MyPos[0]++;
                System.out.print("Move Right");
            }else if(CharIn.equalsIgnoreCase(" ")){
                //Fire Bullet   
            }
        PreControls.ReadKeyPressed.setText("");
        SpaceInvaders.MyShip.setLocation(SpaceInvaders.MyPos[0], SpaceInvaders.MyPos[1]);
        jp1.repaint();
        }
    }
}
很抱歉没有提供SSCCEE。我需要发送我的整个项目,这就违背了做项目的意义

ReadKeyPressed是我输入字母的JTextArea。 jp1是JFrame

我在EclipseIDE中工作

编辑:忘记添加:启动小程序后,控制台仅显示“应启动线程”,所以我如何创建线程或如何创建线程是个问题

编辑2:我的最终目标是检测何时按下(或向左箭头)并将我的臀部(JLabel)向左移动1个位置,如果按下d(或向右箭头),则将其向右移动1个位置


好的,我已经接受了威廉姆斯的答案,因为它让我的线程运行。正如所建议的,我将研究按键绑定以检测按键的按下时间。谢谢您的帮助。

这是一名辅助操作员

while(SpaceInvaders.GameOn = true)
我想你想要这个
==

while(SpaceInvaders.GameOn == true)
或者更好,更干净,只是

while(SpaceInvaders.GameOn)


此外,您应该使用键绑定,而不是
keylister
,这会给您带来焦点问题。有关使用键绑定的示例,请参见。另请参见

=
是辅助操作员

while(SpaceInvaders.GameOn = true)
我想你想要这个
==

while(SpaceInvaders.GameOn == true)
或者更好,更干净,只是

while(SpaceInvaders.GameOn)


此外,您应该使用键绑定,而不是
keylister
,这会给您带来焦点问题。有关使用键绑定的示例,请参见。另请参见在方法
MyShipController
中编写的代码应该放在线程的
run
方法中。run方法是线程在其中实际执行的方法

正如您现在编写的那样,在
控制器
类上调用start将启动线程,该线程将立即结束,因为它的
run
方法为空

public class Controller extends Thread {

@Override
public void run()
//public void MyShipController(){
    System.out.print("Thread Is started ");
    String CharIn = "";
    while(SpaceInvaders.GameOn = true){
        CharIn = PreControls.ReadKeyPressed.getText();
        if(CharIn.equalsIgnoreCase("a")){
            SpaceInvaders.MyPos[0]--;
                System.out.print("Move Left ");
            }else if(CharIn.equalsIgnoreCase("d")){
                SpaceInvaders.MyPos[0]++;
                System.out.print("Move Right");
            }else if(CharIn.equalsIgnoreCase(" ")){
                //Fire Bullet   
            }
    PreControls.ReadKeyPressed.setText("");
    SpaceInvaders.MyShip.setLocation(SpaceInvaders.MyPos[0], SpaceInvaders.MyPos[1]);
    jp1.repaint();
    }
    }
}

但是,我建议您的控制器类扩展
Runnable
而不是
Thread

您在方法
MyShipController
中编写的代码应该放在线程的
run
方法中。run方法是线程在其中实际执行的方法

正如您现在编写的那样,在
控制器
类上调用start将启动线程,该线程将立即结束,因为它的
run
方法为空

public class Controller extends Thread {

@Override
public void run()
//public void MyShipController(){
    System.out.print("Thread Is started ");
    String CharIn = "";
    while(SpaceInvaders.GameOn = true){
        CharIn = PreControls.ReadKeyPressed.getText();
        if(CharIn.equalsIgnoreCase("a")){
            SpaceInvaders.MyPos[0]--;
                System.out.print("Move Left ");
            }else if(CharIn.equalsIgnoreCase("d")){
                SpaceInvaders.MyPos[0]++;
                System.out.print("Move Right");
            }else if(CharIn.equalsIgnoreCase(" ")){
                //Fire Bullet   
            }
    PreControls.ReadKeyPressed.setText("");
    SpaceInvaders.MyShip.setLocation(SpaceInvaders.MyPos[0], SpaceInvaders.MyPos[1]);
    jp1.repaint();
    }
    }
}


但是,我建议您的控制器类扩展
Runnable
而不是
Thread

您还没有重写
run()
方法。您只添加了一个不相关的
MyShipController()
方法。不,您不清楚的概念,或者现在这里是这个站点的。我们不希望看到您的全部代码或代码片段。相反,我们需要一个全新的程序,它很小,可以提取您的问题,可以运行,可以演示您的问题。请重新阅读链接。尝试扩展Runnable而不是thread,并实现single run()方法。另外,为什么要使用KeyListener?这个问题听起来像是个问题。与其告诉我们您遇到的代码问题,不如告诉我们您试图实现的总体目标。可能还有更好的方法。看起来您应该使用KeyBinding和Swing计时器。您还没有重写
run()
方法。您只添加了一个不相关的
MyShipController()
方法。不,您不清楚的概念,或者现在这里是这个站点的。我们不希望看到您的全部代码或代码片段。相反,我们需要一个全新的程序,它很小,可以提取您的问题,可以运行,可以演示您的问题。请重新阅读链接。尝试扩展Runnable而不是thread,并实现single run()方法。另外,为什么要使用KeyListener?这个问题听起来像是个问题。与其告诉我们您遇到的代码问题,不如告诉我们您试图实现的总体目标。可能有更好的方法。看起来你应该使用键绑定,而不是一个摆动计时器。我没注意到,谢谢。但是线程仍然没有启动。并且控制台不输出“threadisstart”,这不依赖于while语句。但是谢谢你抓住while语句中的错误。@ShivamAmin问题中的第一条评论回答了你的问题。我的答覆更详细地解释了为何会出现这种情况。请两个都读。此答案更正了
MyShipController
中的逻辑错误,但
MyShipController
中的代码仍然从未执行过。@peeskillet我现在正在阅读您的建议,希望它能帮助我了解如何将密钥绑定添加到程序中。我没有注意到,谢谢。但是线程仍然没有启动。并且控制台不输出“threadisstart”,这不依赖于while语句。但是谢谢你抓住while语句中的错误。@ShivamAmin问题中的第一条评论回答了你的问题。我的答覆更详细地解释了为何会出现这种情况。请两个都读。这个答案纠正了
MyShipController
中的一个逻辑错误,但是
MyShipController
中的代码仍然没有执行。@peeskillet我现在正在阅读你的建议,希望它能帮助我理解如何将键绑定添加到程序中。调用Swing命令(重新绘制除外)从后台线程中==危险代码。好的,这修复了线程未启动的问题