多线程Java方法仅在调度器可运行关闭后使用JavaFX运行一次完整代码
我一直在编写俄罗斯方块游戏,试图学习Java和JavaFX。 当我第一次从方法start调用该方法时,它运行良好,当我从线程调用它时,它只部分运行,并且不向窗格添加新节点
Here是代码的一部分,您可以在
@Override
public void start(Stage stage) {
...
stage.show();
newPieces();
}
public void newPieces() {
Pieces pieces = new Pieces();
piece = pieces.createPiece();
nextPiece = pieces.createPiece();
boolean add1 = vbox.getChildren().add(nextPiece);
boolean add2 = pane.getChildren().add(piece);
translateDown(piece);
}
public void translateDown(Group piece) {
scheduler.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
boolean translate = piece.getTransforms().add(new Translate(0, 25));
...
...
newPieces();
scheduler.shutdown();
...
...
}, 0, 1, TimeUnit.SECONDS);
newPieces方法创建一组矩形
谢谢
# 1 楼答案
我建议使用
Timeline
在应用程序线程上执行帧的事件处理程序,而不是使用执行器来安排更新。在应用程序线程上运行更新非常重要,因为在不同线程上修改节点的属性是有问题的:您还可以使用
timeline.pause()
暂停游戏,并设置rate
属性以加快游戏速度# 2 楼答案
如果要访问JavaFXGUI组件,必须在javafx线程上运行代码。不允许启动的额外线程访问javafx元素。引发的异常可能未被修补
用修改gui的代码尝试
Platform.runLater(Runnable runnable)
。这将在将来的某个时间在javafx线程上运行指定的runnable