我有一个奇怪的问题,我需要帮助。 这是一个非常简单的应用程序。我有一个保存在Car对象中的Rectangle Shape。
public class Car {
private Rectangle rect;
private TheFourCarDeadlock.direction direction;
public Car(Rectangle r, TheFourCarDeadlock.direction d) {
this.rect = r;
this.direction = d;
}
public void move() {
double xPos;
double yPos;
switch (direction) {
case left:
// make sure x is a positive nr between 0 and 600
xPos = (rect.getX() - 1) % 600;
if (xPos < 0) {
xPos = 600;
}
rect.setX(xPos);
System.out.println(String.format("move left, x: %1.0f", xPos));
break;
case right:
xPos = (rect.getX() + 1) % 600;
rect.setX(xPos);
System.out.println(String.format("move right, x: %1.0f", xPos));
break;
case up:
yPos = (rect.getY() - 1) % 600;
rect.setY(yPos);
break;
case down:
yPos = (rect.getY() + 1) % 600;
rect.setY(yPos);
break;
default:
throw new AssertionError(direction.name());
}
}
}
Car类根据设定的方向向左或向右移动汽车对象。
public class TheFourCarDeadlock extends Application {
int maxWidth = 600;
int maxHeight = 600;
Car carFromLeft;
Car carFromRight;
public static enum direction {
left, right, up, down
};
@Override
public void start(Stage primaryStage) {
// setup
Group root = new Group();
Scene scene = new Scene(root, maxWidth, maxHeight);
// cars
// cars on left side going right
Rectangle leftSide = new Rectangle(0, 350 - 10, 20, 20);
leftSide.setFill(Color.BLUE);
root.getChildren().add(leftSide);
carFromLeft = new Car(leftSide, direction.right);
// cars on right side going left
Rectangle rightSide = new Rectangle(600, 250 + 10, -20, -20);
rightSide.setFill(Color.BLUE);
root.getChildren().add(rightSide);
carFromRight = new Car(rightSide, direction.left);
primaryStage.setTitle("The Four Car Deadlock");
primaryStage.setScene(scene);
primaryStage.show();
Thread t = new Thread(new DrawRunnable());
t.start();
}
public void moveCars() {
carFromLeft.move();
carFromRight.move();
}
private class DrawRunnable implements Runnable {
@Override
public void run() {
try {
while (true) {
Thread.sleep(30);
Platform.runLater(new Runnable() {
@Override
public void run() {
moveCars();
}
});
}
} catch (InterruptedException ex) {
System.out.println("Interrupted");
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
在主应用程序中,我创建了两辆车,一辆向右,一辆向左走。我用螺纹t每30毫秒移动一辆汽车。
现在,我不明白的一个奇怪的事情是 carFromLeft 工作正常并显示在表单中,然后按照我的计划向右移动。 carFromRight ,具有完全相同的代码并采用相同的方式。只是静止不动......即使在输出中它打印出矩形的位置x正在改变它应该的样子。
在输出中我得到了这个:
move left, x: 436
move right, x: 165
move left, x: 435
move right, x: 166
move left, x: 434
move right, x: 167
move left, x: 433
move right, x: 168
move left, x: 432
move right, x: 169
move left, x: 431
move right, x: 170
move left, x: 430
因此矩形改变了它们的x位置。一个向左,一个向右。但只有向右移动的那个更新并以形式绘制......发生了什么?
答案 0 :(得分:1)
你给了一个负高度和宽度的矩形 - 如果你给它一个正面的,它会显示并从左到右移动。
BTW - 在JavaFX中,您不应该使用线程来实现此功能,因为您使用Platform.runLater调用向系统发送垃圾邮件。您应该使用动画,例如TranslateTransition