希望你们一切顺利。
此外,我很抱歉这是多久的啰嗦。我是Java的新手,所以请原谅我缺乏知识/术语/ Java惯例。
基本上我已经创建了一个程序,它接受用户输入并将车辆移动到表面区域。因此,用户输入可以是" 50 left 4"这意味着向前走50米,向左转,向前走4米。 对于车辆,我在JPanel上使用绘画方法。当车辆向前移动时,它最初从该区域的一侧跳到另一侧。我希望能够看到它逐米移动。所以我添加了一个Swing Timer,它将车辆移动1米,暂停一秒钟,将车辆移动2米等等。
现在,问题在于,当我输入命令" 50 left 4"时,车辆只需向左转,然后向前移动4米。它忽略了第一个数字命令。当我输入" 3 4"时会发生同样的情况,它将忽略3并向前移动4米。当我进入" 3左"时,它将先左转,然后向前移动3米。现在,我已经获得了用户输入的方法,将其切换成数组,通过循环提供数组的每个元素,检查它是否为整数。如果它是一个整数,它会使车辆向前移动,如果不是,它会向左或向右转动车辆。一切正常,我很满意。
所以我认为我所做的是拥有移动车辆工具Runnable的类,这样该方法将从一个单独的线程执行,使主线程等待,这样它就会赢得“不”。忽略除最后一个之外的所有命令。但这也不起作用。
这是使用摆动计时器将车辆一次向前移动1米的运动等级 它实现了Runnable。它是抽象的,因为我需要run方法将用户输入命令作为参数。这是导致问题的原因吗?
public abstract class Movement implements Runnable {
static int count = 0;
static int distance;
public static void moveRover() {
// Every 1 second the timer will move the Rover 40 pixels.
at.translate(0, 40);
}
public static void getDistance(int num) {
distance = num;
}
static Timer timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
moveRover();
count++;
System.out.println(count);
if (count == distance) {
stop();
System.out.println("Timer stopped");
count = 0;
}
}
});
public static void start(int num) {
getDistance(num);
System.out.println("Distance rover will travel: " + distance);
System.out.println("\nTimer started");
timer.start();
}
public static void stop() {
timer.stop();
}
public void run(int num) {
start(num);
}
public Movement(int num) {
System.out.println("Start RUN method");
run(num);
}
这是来自另一个运行for循环和线程的类的代码:
public static void action(final String[] commands) {
for (int i = 0; i < commands.length; i++) {
if (isInteger(commands[i])) {
int distance = Integer.parseInt(commands[i]);
Movement h1 = new Movement(distance) {
@Override
public void run() {
System.out.println("Empty run method");
}
};
Thread t1 = new Thread(h1);
t1.start();
System.out.println(t1.isAlive());
try {
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
Direction.start(commands[i]);
String pos = Direction.getDirection(); // GET DIRECTION
}
}
}
我非常感谢你阅读所有这些,非常感谢你!
感谢所有回复的人!如果你知道我哪里出错了,我能做些什么来解决它,你就是一个绝对的救星,我真的很感激它:D
答案 0 :(得分:0)
所以是的,您需要了解Java中的线程。从Java 1.6及更高版本开始,你永远不应该使用Thread.start()。坦率地说,我甚至不确定你为什么在for-loop中使用Threads。暂时忽略所有可疑的设计选择,请尝试以下代码:
public static void action(final String[] commands) {
for (int i = 0; i < commands.length; i++) {
if (isInteger(commands[i])) {
int distance = Integer.parseInt(commands[i]);
new Movement(distance) {
@Override
public void run() {
System.out.println("Empty run method");
}
}.run();
} else {
Direction.start(commands[i]);
String pos = Direction.getDirection(); // GET DIRECTION
}
}
}