Java 正在尝试启动我的线程
首先,我知道我尝试读取输入的方式非常糟糕,但我尝试使用Keylistener,无论我尝试什么,它都不起作用。我不知道我做错了什么,所以这就是我目前正在尝试的。我试图从PreControls.java调用Controller.java中的线程。如果您能帮助我实现一个工作的keylistener,我将不胜感激,但我认为解决这个线程问题也会奏效。我试过调试它,但线程似乎没有启动 precontrolls.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
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命令(重新绘制除外)从后台线程中==危险代码。好的,这修复了线程未启动的问题