Создание нескольких сцен приводит к «java.lang.NullPointerException» - PullRequest
0 голосов
/ 11 ноября 2019

Итак, я написал контроллер, который должен перемещаться между несколькими сценами, когда создается вторая сцена java.lang.NullPointerException. Ниже представлен мой контроллер с View1() и View2() в одном файле mre, чтобы вы могли понять, что происходит. Моя цель - просто иметь несколько экранов и несколько моделей, а с помощью переключателя устанавливать разные сцены на сцене.

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.canvas.*;
import javafx.scene.image.Image;

public class Controller extends Application {

    private Scene scene1, scene2;

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

    public void start(Stage theStage) {
        this.scene1 = new Scene(new Group(new View1()));
        this.scene2 = new Scene(new Group(new View2()));

        new AnimationTimer() {

            int page = 2;
            @Override
            public void handle(long currentNanoTime){
                // System.out.println(currentNanoTime);
                switch (page){
                    case 2:
                        page = 1;
                        theStage.setScene(scene1);
                        break;
                    case 1:
                        page = 2;
                        theStage.setScene(scene2);
                        break;
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        theStage.show();
    }
}

class View1 extends Group {

    public View1() {

        Image img = new Image("https://i.imgur.com/8tcxHWh.jpg");
        Canvas canvas = new Canvas(img.getWidth(), img.getHeight());
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.drawImage(img, 0, 0, canvas.getWidth(), canvas.getHeight());
        getChildren().add(canvas);
    }
}

class View2 extends Group {

    public View2() {

        Image img = new Image("https://i.imgur.com/BF3ty6o.jpg");
        Canvas canvas = new Canvas(img.getWidth(), img.getHeight());
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.drawImage(img, 0, 0, canvas.getWidth(), canvas.getHeight());
        getChildren().add(canvas);
    }
}

1 Ответ

1 голос
/ 11 ноября 2019

Я бы рекомендовал не использовать AnimationTimer. Я бы посоветовал вам использовать Buttons для загрузки разных дисплеев. Это приложение демонстрирует один из способов использования Buttons для переключения между дисплеями.

Main

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        final StackPane mainDisplay = new StackPane();
        final ViewOne viewOne = new ViewOne();
        final ViewTwo viewTwo = new ViewTwo();

        mainDisplay.getChildren().add(viewOne);//Load first view.

        Button btnStageOne = new Button("View One");
        Button btnStageTwo = new Button("View Two");

        btnStageOne.setOnAction((event) -> {
            if(!mainDisplay.getChildren().get(0).equals(viewOne))//If sceneone is not loaded, load it.
            {
                 mainDisplay.getChildren().set(0, viewOne);
            }

        });
        btnStageTwo.setOnAction((event) -> {
            if(!mainDisplay.getChildren().get(0).equals(viewTwo))//If scenetwo is not loaded, load it.
            {
                mainDisplay.getChildren().set(0, viewTwo);
            }
        });

        HBox hbButtonPanel = new HBox(btnStageOne, btnStageTwo);
        VBox root = new VBox(mainDisplay, hbButtonPanel);
        Scene scene = new Scene(root);
        primaryStage.setTitle("Hello World!");        
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

ViewOne

import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;

/**
 *
 * @author sedrick
 */
public final class ViewOne extends StackPane{
    Label label = new Label();

    public ViewOne() {
        label.setText("Scene One!");
        getChildren().add(label);
    }   
}

ViewTwo

import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;

/**
 *
 * @author sedrick
 */
public final class ViewTwo extends StackPane{
    Label label = new Label();

    public ViewTwo() {
        label.setText("Scene Two!");
        getChildren().add(label);
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...