我正在独自学习JavaFx,但尚未达到FXML。我被困在一个应用程序中,我计划在用户在第二个场景中输入其凭据之后将其返回到应用程序的主场景。我设法从第二个场景调到第二个场景,但我无法从第二个场景调到第二个场景。我尝试使用吸气剂获得主要场景和窗格,但没有运气。你们可以教正确的方法吗?

先感谢您。

public class Landing extends Application {
    BorderPane bp;
    Scene scene;
    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Welcome to our Telco!");
        bp = new BorderPane();
        VBox vbox = new VBox();
        Button login = new Button("Login");
        login.setMinWidth(100);

        Button acc = new Button("Account Information");
        acc.setMinWidth(100);

        vbox.getChildren().addAll(acc);

        bp.setCenter(vbox);

        acc.setOnAction(e ->{
            AccountInfo account = new AccountInfo();
            primaryStage.setTitle("Account Information"); // Set the stage title
            primaryStage.getScene().setRoot(account.getbp());; // Place the scene in the stage
        });

        scene = new Scene(bp, 750, 550);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public Pane getbp() {
        return bp;
    }
    public Scene getSc(){
        return scene;
    }


获取主要场景的按钮

public class AccountInfo {
    BorderPane pane;
    Landing main = new Landing();
    Scene scene;
    AccountInfo() {
        Button c = (new Button("Back"));
        c.setStyle("-fx-background-color: pink");
        c.setOnAction((ActionEvent e) -> {
        main.getbp();
        main.getSc();
    });
    public Pane getbp() {
        return pane;
    }
}

最佳答案

Landing不是场景,它是Application。到目前为止,与您所展示的相比,整个应用程序中只有一个场景。在相同的JavaFX应用程序生存期内,您绝不能尝试实例化(并随后运行)多个任何Application类的实例。在Landing main = new Landing();类中执行AccountInfo时,您很危险地朝着这个方向前进。

JavadocApplication.launch


  抛出:IllegalStateException-如果此方法的调用次数超过
  一旦。


您需要的是拥有第一个登录场景(即输入凭据)。登录成功后,您将创建一个新的场景对象,并用下一个“视图”填充该场景,然后将该新场景设置为舞台。

public class Landing extends Application {
    BorderPane bp;
    Scene scene;

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Welcome to our Telco!");
        bp = new BorderPane();
        VBox vbox = new VBox();
        Button login = new Button("Login");
        login.setMinWidth(100);

        Button acc = new Button("Account Information");
        acc.setMinWidth(100);

        vbox.getChildren().addAll(acc);

        bp.setCenter(vbox);

        acc.setOnAction(e -> {
            primaryStage.setTitle("Account Information"); // Set the stage title
            BorderPane infoScenePane = new BorderPane();
            Scene infoScene = new Scene(infoScenePane);
            primaryStage.setScene(infoScene);
        });

        scene = new Scene(bp, 750, 550);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

10-08 16:04