繁体   English   中英

如何在 javafx 中根据时间更改场景

[英]how to change scene based on time in javafx

java 和 JavaFX 的新手,请多多包涵

我需要演示 5 个 3d 水果模型,它们以连续循环显示,间隔 15 秒:fruit1 15 秒,fruit2 15 秒广告,依此类推.. 直到fruit5 15 秒,然后返回fruit1 和继续,直到我按下应该关闭 window 的 ESC 键。

我也知道更改构成场景的根组 object 而不是更改场景是理想的,所以我在代码中进行了更改

我知道需要一个时间线来改变场景中的某些内容,但我已经尝试过类似于这个答案所说的内容,但我不明白如何切换场景的根每 15 秒

更新:

我放弃了时间线选项,我发现本文中看到的 platform.run 选项似乎有效,因为我看到 window 更新从场景数组中的第一个水果迭代到第二个,但我不知道为什么仅在我需要它每 15 秒运行一次时运行一次,这意味着我的场景切换器:nextSceneIndex() 应该 go 在 1 和 0 之间来回切换。

更新2:

我回到了时间线建议,并实施了 Sedrick 的解决方案,它奏效了……我高兴极了:)

这是我的工作代码!


  public void start(Stage stage) throws Exception {

        BorderPane[] scenes = new BorderPane[]{createSceneApple(),createSceneCarrot(),createSceneTomato()};


        Timeline tl = new Timeline();
        tl.setCycleCount(Animation.INDEFINITE);
        KeyFrame kf_fruit = new KeyFrame(Duration.seconds(10),
                new EventHandler<ActionEvent>() {
                    public void handle(ActionEvent event) {

                       if (index==0){
                           root.getChildren().setAll(scenes[0]);
                           index = 1;
                       }else if(index==1){
                           root.getChildren().setAll(scenes[1]);
                           index = 2;
                       }else if(index==2){
                           root.getChildren().setAll(scenes[2]);
                           index = 0;
                       }
                    }  
        });

        tl.getKeyFrames().add(kf_fruit);
        tl.play();

        Scene scene = new Scene(root, windowWidth, windowHeight);
        stage.setScene(scene);
        stage.show();

}


也许你可以从这里得到一些想法。 这使用了我上面发布的链接中的代码。 Timeline用于循环遍历Shape列表和有关该形状的信息。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 * JavaFX App
 */
public class App extends Application {

    @Override
    public void start(Stage stage) {
        List<MyShape> shapes = new ArrayList();
        shapes.add(new MyShape("Circle", "Shape.Circle", "More Circle Info", new Circle(25, Color.BLUE)));
        shapes.add(new MyShape("Rectangle", "Shape.Rectangle", "More Rectangle Info", new Rectangle(100, 50, Color.RED)));
        shapes.add(new MyShape("Line", "Shape.Line", "More Line Info", new Line(0, 0, 100, 100)));


        TextField tf1 = new TextField();
        TextField tf2 = new TextField();
        TextArea ta1 = new TextArea();        
        VBox leftWindow = new VBox(tf1, tf2, ta1);

        StackPane rightWindow = new StackPane(shapes.get(1).getShape());

        AtomicInteger counter = new AtomicInteger();
        Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println(counter.get() % shapes.size());
                MyShape currentShape = shapes.get(counter.getAndIncrement() % shapes.size());
                tf1.setText(currentShape.getName());
                tf2.setText(currentShape.getType());
                ta1.setText(currentShape.getMoreInfo());
                rightWindow.getChildren().set(0, currentShape.getShape());
            }
        }));
        timeline.setCycleCount(Timeline.INDEFINITE);
        timeline.play();

        BorderPane root = new BorderPane();
        root.setLeft(new StackPane(leftWindow));
        root.setRight(rightWindow);

        var scene = new Scene(root, 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

}

更新:如果你只有两个场景,那会简化一些事情。 您基本上需要设置初始视图。 然后,您需要每两秒切换一次当前显示的视图。 (我用了两秒钟,这样你就可以在它们被关闭之前看到视图)。 我创建了自己的createSceneCarrotcreateSceneApple版本,因为我不知道您的实现。

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 * JavaFX App
 */
public class App extends Application {

    @Override
    public void start(Stage stage) {
        BorderPane[] scenes = new BorderPane[]{createSceneApple(),createSceneCarrot()};


        StackPane root = new StackPane(scenes[0]);//Set initial view;      

        Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(2), (ActionEvent event) -> {
            if(root.getChildren().get(0).equals(scenes[0]))//If the first scene is loaded, load the second scene.
            {
                root.getChildren().set(0, scenes[1]);
            }
            else
            {
                root.getChildren().set(0, scenes[0]);
            }
        }));
        timeline.setCycleCount(Timeline.INDEFINITE);
        timeline.play();

        var scene = new Scene(root, 640, 640);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

    public BorderPane createSceneApple()
    {
        BorderPane borderPane = new BorderPane();

        TextField tf1 = new TextField("Rectangle 1");
        TextField tf2 = new TextField("Rectangle Color: Blue");
        TextArea ta1 = new TextArea("20x40");        
        VBox leftWindow = new VBox(tf1, tf2, ta1);
        borderPane.setLeft(leftWindow);

        StackPane rightWindow = new StackPane(new Rectangle(20, 40, Color.BLUE));
        borderPane.setRight(rightWindow);

        return  borderPane;
    }

    public BorderPane createSceneCarrot()
    {
        BorderPane borderPane = new BorderPane();

        TextField tf1 = new TextField("Circle 1");
        TextField tf2 = new TextField("Circle Color: Blue");
        TextArea ta1 = new TextArea("Radius: 50");        
        VBox leftWindow = new VBox(tf1, tf2, ta1);
        borderPane.setLeft(leftWindow);

        StackPane rightWindow = new StackPane(new Circle(50, Color.RED));
        borderPane.setRight(rightWindow);

        return  borderPane;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM