切换场景不会保留 JavaFX 中的最大化屏幕

Switching scenes don't retain maximized screen in JavaFX

我的配置:

我的问题:

到目前为止我尝试过的:

我需要你的帮助:

这是我的示例代码:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class NewFXMain extends Application {

@Override
public void start(Stage primaryStage) {

    // init buttons
    Button btn1 = new Button("switch to next scene >>");
    Button btn2 = new Button("<< switch to previous scene");

    // first scene
    StackPane root1 = new StackPane();
    root1.getChildren().add(btn1);
    Scene scene1 = new Scene(root1, 300, 250);

    // second scene
    StackPane root2 = new StackPane();
    root2.getChildren().add(btn2);
    Scene scene2 = new Scene(root2, 500, 400);

    // button actions
    btn1.setOnAction((ActionEvent event) -> {
        primaryStage.setScene(scene2);
    });
    btn2.setOnAction((ActionEvent event) -> {
        primaryStage.setScene(scene1); 
    });

    primaryStage.setMaximized(true);
    primaryStage.setScene(scene1);
    primaryStage.show();
}

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

}

我认为这是一个错误。您可以在 http://bugreport.java.com 举报。

同时,作为解决方法,您可能只需要为共享场景设置窗格,替换其内容而不是替换场景。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class NewFXMainFixed extends Application {

    @Override
    public void start(Stage primaryStage) {
        // init buttons
        Button btn1 = new Button("switch to next scene >>");
        Button btn2 = new Button("<< switch to previous scene");

        // first scene
        StackPane root1 = new StackPane();
        root1.getChildren().add(btn1);

        // second scene
        StackPane root2 = new StackPane();
        root2.getChildren().add(btn2);

        // button actions
        btn1.setOnAction((ActionEvent event) -> 
                primaryStage.getScene().setRoot(root2)
        );
        btn2.setOnAction((ActionEvent event) -> 
                primaryStage.getScene().setRoot(root1)
        );

        Scene scene = new Scene(root1);
        primaryStage.setMaximized(true);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}

解决方案

create scenes depending on the screen size of your monitor

经过多次尝试,我终于想通了如何轻松解决这个问题,以保持最大化屏幕,同时在每个场景上保留焦点节点。希望对社区有所帮助:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Screen;
import javafx.stage.Stage;

public class NewFXMain extends Application {

@Override
public void start(Stage primaryStage) {

    // get screensize of monitor
    Rectangle2D screenSize = Screen.getPrimary().getVisualBounds();

    // init buttons
    Button btn1 = new Button("switch to next scene >>");
    Button btn2 = new Button("<< switch to previous scene");

    // first rootNode
    StackPane root1 = new StackPane();
    root1.getChildren().add(btn1);
    Scene scene1 = new Scene(root1, screenSize.getWidth(), screenSize.getHeight());

    // second rootNode
    StackPane root2 = new StackPane();
    root2.getChildren().add(btn2);
    Scene scene2 = new Scene(root2, screenSize.getWidth(), screenSize.getHeight());

    // button actions
    btn1.setOnAction((ActionEvent event) -> {
        primaryStage.setScene(scene2);
    });
    btn2.setOnAction((ActionEvent event) -> {
        primaryStage.setScene(scene1);
    });

    primaryStage.setMaximized(true); // keep this since otherwise the titlebar is bit overlapped
    primaryStage.setScene(scene1);
    primaryStage.show();
}

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

}