首先,我知道我尝试读取输入的方式非常糟糕,但我尝试使用 Keylistener,但无论我如何尝试,它都不起作用。我不知道我做错了什么,所以这就是我现在正在尝试的。我试图从 PreControls.java 调用 Controller.java 中的线程。如果您可以帮助我实现一个有效的按键监听器,我将非常感激,但我认为解决这个线程问题也可以。我尝试过调试它,但线程似乎没有启动。
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 中工作。
编辑:忘记添加:启动小程序后,控制台仅显示“线程应该启动”,因此这是我如何创建线程或如何创建线程的问题。
编辑2:我的最终目标是检测何时按下a(或向左箭头),并将MyShip(JLabel)向左移动1个位置,如果d(或向右箭头)则将其向右移动1个位置被按下。
好吧,我已经接受了威廉姆斯的回答,因为它使我的线程得以运行。正如所建议的,我将研究按键绑定(bind)以检测何时按下按键。感谢您的所有帮助。
最佳答案
这个=
是一个Assinment运算符。
while(SpaceInvaders.GameOn = true)
我想你想要这个==
while(SpaceInvaders.GameOn == true)
或者更好,更干净,只是
while(SpaceInvaders.GameOn)
<小时/>
此外,您应该使用键绑定(bind)而不是 KeyListener
,这会给您带来焦点问题。请参阅this answer有关使用键绑定(bind)的示例。另请参阅the tutorial
关于java - 尝试启动我的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067169/