【问题标题】:Java method run only once the full code after a scheduler runnable shutdown using JavaFXJava 方法仅在使用 JavaFX 的调度程序可运行关闭后运行一次完整代码
【发布时间】:2018-02-01 13:52:15
【问题描述】:

我一直在编写俄罗斯方块游戏,试图学习 Java 和 JavaFX。 当我第一次从方法开始调用该方法时,它运行良好,当我从线程调用它时,它仅部分运行,并且不向窗格添加新节点。

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 方法创建一个矩形组。

谢谢!

【问题讨论】:

  • 我试图用这段代码做的是生成一个新的俄罗斯方块块并将其翻译到窗格底部。

标签: java multithreading javafx


【解决方案1】:

我推荐使用Timeline,而不是使用执行程序来安排更新,它在应用程序线程上执行框架的事件处理程序。在应用程序线程上运行更新很重要,因为在不同线程上修改节点的属性是有问题的:

Timeline timeline = new Timeline();

timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(1), evt -> {
    updateBoard(); // do things like moving a piece...

    if (checkLoss()) {
        // stop updates when game is lost
        timeline.stop();
    }
}));

// repeat indefinitely
timeline.setCycleCount(Animation.INDEFINITE);

timeline.play();

您也可以使用timeline.pause() 暂停游戏并设置rate 属性以加快游戏速度...

【讨论】:

    【解决方案2】:

    如果您想访问 javafx gui 组件,您必须在 javafx 线程上运行代码。您启动的额外线程不允许访问 javafx 元素。抛出的异常可能未被捕获。

    使用修改 gui 的代码尝试 Platform.runLater(Runnable runnable)。这会在未来某个时间在 javafx 线程上运行指定的可运行对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      相关资源
      最近更新 更多