我正在尝试以编程方式为JavaFX中的一组矩形的大小调整设置动画,但我很可能因为线程而出现问题。
程序在widthOfRectangles.set(...
时崩溃,即使它是后台线程中的循环并且它应该停止。我假设设置DoubleProperty所有我的矩形宽度都绑定在Platform.runLater
中将无法正常工作。
所以我在没有Platform.runLater
的情况下再次尝试(不是下面显示的代码),但是这一次,它延迟了矩形应该扩展/最小化的持续时间,然后突然跳转到最终状态 - 至少它没有崩溃,但这不是我想要的流畅动画。
是否可以通过PropertyBindings平滑地插入节点的属性,如果是这样,我将如何在不冻结JavaFX主线程的情况下进行操作?
expandProgressGraphic = new Thread(new Task<Void>() {
@Override
public Void call() throws Exception {
while (widthOfRectangles.get() < 130) {
Platform.runLater(() ->
widthOfRectangles.set(widthOfRectangles.get() + (130 - widthOfRectangles.get()) / 3 + 2));
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
widthOfRectangles.set(130);
return null;
}
});
expandProgressGraphic.setDaemon(true);
minimizeProgressGraphic = new Thread(new Task<Void>() {
@Override
public Void call() throws Exception {
while (widthOfRectangles.get() > 40) {
Platform.runLater(() ->
widthOfRectangles.set(widthOfRectangles.get() - (widthOfRectangles.get() - 40) / 3 - 2));
try {
Thread.sleep(30);
} catch (InterruptedException e) {e.printStackTrace();}
}
widthOfRectangles.set(40);
return null;
}
});
expandProgressGraphic.setDaemon(true);
pane.setOnMouseMoved(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if(widthOfRectangles.get() != 130 && event.getX() < widthOfRectangles.get() && !expandProgressGraphic.isAlive()) {
expandProgressGraphic.run();
} else if(widthOfRectangles.get() != 40 && event.getX() > widthOfRectangles.get() && !minimizeProgressGraphic.isAlive()){
minimizeProgressGraphic.run();
}
}
});
答案 0 :(得分:0)
再次感谢@sillyfly。
我应该使用Thread.start()
代替Thread.run()