试图开始我的线程

时间:2014-01-11 19:59:40

标签: java eclipse multithreading swing keylistener

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

PreControls.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

我在Eclipse IDE中工作。

编辑:忘记添加:在我启动applet之后,控制台只读取“Thread should be started”,所以这是我创建线程的方式,或者我是如何创建它的问题。< / p>

编辑2:我的目标是检测何时按下(或向左箭头)并将MyShip(一个JLabel)向左移动1个位置,如果d(或向右箭头)向右移动1个位置被按下了。

好吧,我接受了威廉姆斯的答案,因为它使我的线程运行。正如所建议的那样,我将研究用于检测按键何时按下的键绑定。感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

=是一个分配运营商。

while(SpaceInvaders.GameOn = true)

我想你想要这个==

while(SpaceInvaders.GameOn == true)

或者更好,更清洁,只是

while(SpaceInvaders.GameOn)

此外,您应该使用键绑定而不是KeyListener,这会让您关注问题。有关使用键绑定的示例,请参阅this answer。另请参阅the tutorial

答案 1 :(得分:1)

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

正如您现在所写的那样,在Controller类上调用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