首先,我知道我尝试读取输入的方式非常糟糕,但我尝试使用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个位置被按下了。
好吧,我接受了威廉姆斯的答案,因为它使我的线程运行。正如所建议的那样,我将研究用于检测按键何时按下的键绑定。感谢您的帮助。
答案 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
。