JavaFx:访问Controller对象

时间:2018-03-07 13:03:10

标签: javafx

我从一个控制器访问对象时遇到问题。 我有三个控制器和三个窗口。这三个窗口都有效。

我想在第三个控制器中访问来自第二个控制器的对象用户用户。这个对象在Second controller中成功启动,但是当我尝试在第三个控制器中访问它时,我得到空指针。

Main:

public class Main extends Application {
    private Stage primaryStage;

    @Override
    public void start(Stage primaryStage) {
        this.primaryStage=primaryStage;
        mainWindow();
    }

    public void mainWindow() {
        try {
          FXMLLoader loader=
            new FXMLLoader(
              Main.class.getResource("/application/User.fxml"));
            AnchorPane pane=loader.load();
            Scene scene=new Scene(pane);
            ControllerUser controllerUser=
                    loader.getController();
            controllerUser.setMain(this,primaryStage);
            primaryStage.setScene(scene);
            primaryStage.show();
            scene.getStylesheets().add
            (Main.class.getResource("application.css").toExternalForm());
        } catch (IOException e) {
          e.printStackTrace();  
        }
    }

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

First Controller

public class ControllerUser {
    private Main main;
    private Stage primaryStage;
    public String localuser;

    public void setMain(Main main, Stage primaryStage) {
        this.main = main;
        this.primaryStage = primaryStage;
    }

    @FXML
    public void closeMainWindow() {
        primaryStage.close();
    }

    @FXML
    TextField textFieldNick;
    @FXML
    Button buttonGraj;

    @FXML
    void graj() {

        localuser = textFieldNick.getText();
        // System.out.println(localuser);

        try {
            FXMLLoader loader = new FXMLLoader(Main.class.getResource("/application/fxml.fxml"));
            AnchorPane pane = loader.load();

            Stage testStage = new Stage();
            testStage.initOwner(primaryStage);

            Scene scene = new Scene(pane);
            testStage.setScene(scene);

            Kontroller kontrollerTest = loader.getController();
            kontrollerTest.setStage(this, testStage);

            primaryStage.close();
            testStage.showAndWait();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public String getLocaluser() {
        return localuser;
    }

    public void setLocaluser(String localuser) {
        this.localuser = localuser;
    }
}

Second Controller:

public class Kontroller {
    // Aby okno sie otowryzlo
    private Stage primaryStage;

    ControllerUser controllerUser;

    public void setStage(ControllerUser controllerUser, Stage primaryStage) {
        this.controllerUser = controllerUser;
        this.primaryStage = primaryStage;
    };


    // ...

    private User user;

    // ...

    public double wynikKoncowy(ArrayList<Gra> g) {

        // ...

        user = new User(controllerUser.getLocaluser(), wynikkoncowy /*...*/)
        // ...
    };

    // ...

    public void otworzKolejneOkno() {
        try {
            FXMLLoader loader = new FXMLLoader(Main.class.getResource("/application/Thankyou.fxml"));
            AnchorPane pane = loader.load();

            Stage testStage2 = new Stage();

            Scene scene = new Scene(pane);
            testStage2.setScene(scene);

            KontrollerThxpage kontrollerThx = loader.getController();
            kontrollerThx.setStage(this, testStage2);
            primaryStage.close();
            testStage2.showAndWait();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

第三控制器:

public class KontrollerThxpage {

    private Stage primaryStage;
    Kontroller kontrollerTest;

    public void setStage(Kontroller kontrollerTest, Stage primaryStage) {
        this.kontrollerTest = kontrollerTest;
        this.primaryStage = primaryStage;
    };

    @FXML
    TextField wynik;

    @FXML
    public void initialize() {
        kontrollerTest.getUser();
    }
}

1 个答案:

答案 0 :(得分:0)

在执行initialize()中的load()方法期间,将调用控制器中的FXMLLoader方法。

所以当你这样做时

FXMLLoader loader = new FXMLLoader(Main.class.getResource("/application/Thankyou.fxml"));
AnchorPane pane = loader.load();

// ...

KontrollerThxpage kontrollerThx = loader.getController();
kontrollerThx.setStage(this, testStage2);

您在initialize() 之前有效地致电KontrollerThxpage,然后再致电kontrollerThx.setStage(...)。所以当时kontrollerTest仍为空。

最简单的解决方法是将依赖kontrollerTest的代码移至setStage(...)方法:

public class KontrollerThxpage {

    private Stage primaryStage;
    Kontroller kontrollerTest;

    public void setStage(Kontroller kontrollerTest, Stage primaryStage) {
        this.kontrollerTest = kontrollerTest;
        this.primaryStage = primaryStage;
        kontrollerTest.getUser();
    };

    @FXML
    TextField wynik;

    @FXML
    public void initialize() {

    }
}