как изменить сцену в зависимости от времени в javafx - PullRequest
0 голосов
/ 11 ноября 2019

Впервые в Java и JavaFX, поэтому, пожалуйста, потерпите меня

Мне нужно сделать презентацию из 5 трехмерных моделей фруктов, которые показывают в непрерывном цикле с интервалом в 15 секунд: fruit1 в течение 15 секунд, затем fruit2 в течение 15 секунди т. д. и т. д. до 15 секунд на fruit5, а затем обратно на fruit1 и продолжается до тех пор, пока я не нажму клавишу ESC, которая должна закрыть окно.

Я также понимаю, что идеально менять объект корневой группыэто составляет сцену вместо смены сцены, поэтому я изменил это в своем коде

Я понимаю, что временная шкала необходима для того, чтобы что-то изменить в сцене во время воспроизведения, но я попробовал счто-то похожее на то, что говорит этот ответ , но я не понимаю, как переключать корень сцены каждые 15 секунд

Я думал добавить временную шкалу для фруктовой сцены, так как это только5 фруктов, но я все еще не могу показать свою первую сцену (с фруктами [0]). Я полагаю, что могу сделать 5 временных шкал по 15 секунд каждая и поместить их в цикл продолжения, пока я не нажму esc.

код ниже компилируется, но после нажатия кнопки run окно не появляется в течение 15 секунд, а затем я получаю окночтобы показать с фруктами, но если раскомментировать закомментированный раздел, я получаю фрукты [0], а затем фрукты 1 , почти желаемый эффект, но я не уверен, как выпрыгнуть из фруктов 1 к фруктам [2] (раз я, конечно, добавил эти фрукты)

уже 2 недели на этом, помогите пожалуйста !!

Обновление: я изменил объект панели для группыобъект и я вынули сцену и сцену из обработчика событий. но все, что я получаю, это пустое окно, когда я запускаю его.

public void start(Stage stage) throws Exception {

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

        Group root = new Group();

        Timeline timeline  = new Timeline();
        // Define the Durations
        Duration sceneDuration = Duration.seconds(15);

        KeyFrame kf = new KeyFrame(sceneDuration, new EventHandler<ActionEvent>(){

            @Override
            public void handle(ActionEvent event) {
                root.getChildren().setAll(scenes[1]);

            }

        });
        timeline.getKeyFrames().add(kf);
        timeline.playFromStart();
        timeline.setCycleCount(1);

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

}

1 Ответ

0 голосов
/ 13 ноября 2019

Может быть, вы можете получить некоторые идеи здесь. Для этого используется код из ссылки, которую я разместил выше. 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();
    }



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...