有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程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方法创建一组矩形

谢谢


共 (2) 个答案

  1. # 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. # 2 楼答案

    如果要访问JavaFXGUI组件,必须在javafx线程上运行代码。不允许启动的额外线程访问javafx元素。引发的异常可能未被修补

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