JavaFX - 如何使用另一个类的场景更改场景?

fwa*_*ckk 3 java user-interface javafx

我有以下带有按钮的课程。

public class GUI extends Application {
    private BorderPane mainLayout = new BorderPane();

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Main Menu");

        FlowPane layout = new FlowPane();
        Button button = new Button("Click");
        layout.getChildren().addAll(button);

        mainLayout.setTop(layout);

        Scene scene = new Scene(mainLayout, 600, 600);

        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我有另一个带有场景的类,如何更新 GUI 类以通过按下按钮来显示场景?

jew*_*sea 5

首选机制可能是从触发事件动态获取阶段,例如:

button.setOnAction(event -> {
    Scene newScene = // ... commands which define the new scene.
    Stage stage = ((Node) event.getTarget()).getScene().getStage();
    // or alternatively, just:
    // Stage stage = button.getScene().getStage();
    stage.setScene(newScene);
});
Run Code Online (Sandbox Code Playgroud)

另一种方法是为应用程序的主阶段提供静态访问器。

更改您的 GUI 类以添加舞台的访问器:

public class GUI extends Application {
    private static Stage guiStage;

    public static Stage getStage() {
        return guiStage;
    }

    @Override
    public void start(Stage primaryStage) {
        guiStage = primaryStage;
        // other app initialization logic . . .
    }
}
Run Code Online (Sandbox Code Playgroud)

在需要将 GUI 阶段的场景更改为新场景的类中,调用:

Scene newScene = // ... commands which define the new scene.
GUI.getStage().setScene(newScene);
Run Code Online (Sandbox Code Playgroud)

在此特定实例中使用静态访问器通常是可以的,因为您只能为给定的 JVM 执行启动一个应用程序实例。唯一真正的缺点是创建新场景的类和应用程序类之间存在编码依赖关系。但是,对于某些应用程序类型,这并不重要。