Изменение сцен с помощью IntelliJ 2018.1 и Scene Builder 9.0.1 - PullRequest
0 голосов
/ 17 мая 2018

Я создал новый проект JavaFx.В проекте у меня есть класс Main, класс Controller и файл дизайна.

Когда я нажимаю «Новые продукты», я хочу загрузить новый fxml-файл с именем new_product.fxml.

enter image description here

Однако при нажатии кнопки «Новый продукт» появляется ошибка:

Caused by: java.lang.NullPointerException
    at sample.Main.changeScene(Main.java:33)
    at sample.Controller.buttonNewProductOnMouseClicked(Controller.java:21)

В строке Main.java33 является primaryStage.Похоже, мой контроллер не может получить к нему доступ?

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class Main extends Application {

    Stage primaryStage;

    @Override
    public void start(Stage primaryStage) throws Exception{
        this.primaryStage = primaryStage;
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        Scene primaryScene = new Scene(root, 300, 275);

        primaryStage.setScene(primaryScene);
        primaryStage.show();

    }
    public void changeScene(String fxml){
        Parent pane = null;
        try {
            pane = FXMLLoader.load(getClass().getResource(fxml));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Scene scene = new Scene( pane );
        primaryStage.setScene(scene);
    }

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

Мой файл дизайна

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>

<BorderPane xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <top>
      <HBox prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER">
         <children>
            <Button fx:id="buttonProducts" mnemonicParsing="false" onMouseClicked="#buttonProductsOnMouseClicked" text="Products" />
            <Button fx:id="buttonNewProduct" mnemonicParsing="false" onMouseClicked="#buttonNewProductOnMouseClicked" text="New products">
               <HBox.margin>
                  <Insets left="5.0" />
               </HBox.margin></Button>
         </children>
      </HBox>
   </top>
   <center>
      <Label text="Label" BorderPane.alignment="CENTER" />
   </center>
</BorderPane>

Класс Controller для файла дизайна

package sample;

import javafx.fxml.FXML;
import javafx.scene.control.Button;

public class Controller {

    @FXML
    private Button buttonProducts;

    @FXML
    private Button buttonNewProduct;

    public void buttonProductsOnMouseClicked(javafx.scene.input.MouseEvent mouseEvent) {
        buttonProducts.setText("You have clicked on me!");
    }
    public void buttonNewProductOnMouseClicked(javafx.scene.input.MouseEvent mouseEvent) {
        buttonNewProduct.setText("You have clicked on me!");

        Main mainclass = new Main();
        mainclass.changeScene("new_product/new_product.fxml");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...