在JavaFX中以125%的比例更改场景时出现布局问题

在JavaFX中以125%的比例更改场景时出现布局问题,javafx,scale,Javafx,Scale,当监视器缩放设置为125%时,我在更改场景为JavaFX后遇到布局问题 当缩放设置为100%时,一切正常 我正在使用JavaFX11.0.2 这是我的密码: import javafx.application.Application; import javafx.geometry.Rectangle2D; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.image.Image;

当监视器缩放设置为125%时,我在更改场景为JavaFX后遇到布局问题

当缩放设置为100%时,一切正常

我正在使用JavaFX11.0.2

这是我的密码:

import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class App extends Application {
    private Scene firstScene;
    private Scene secondScene;

    private Rectangle2D screenBounds = Screen.getPrimary().getBounds();
    private final int backButtonSize = (int) (screenBounds.getWidth() / 50);

    private Image image = new Image("https://imgur.com/download/uDlKu6Y");

    @Override
    public void start(Stage stage) {
        Button forwardButton = new Button("Forward");
        forwardButton.setOnAction(actionEvent -> stage.setScene(secondScene));
        firstScene = new Scene(new StackPane(forwardButton));

        Button backButton = new Button("Back");
        backButton.setOnAction(actionEvent -> stage.setScene(firstScene));
        backButton.setMinWidth(backButtonSize);
        ImageView imageView = new ImageView(image);
        imageView.setFitWidth(screenBounds.getWidth() - backButtonSize);
        imageView.setFitHeight(screenBounds.getHeight());
        imageView.setPreserveRatio(true);
        secondScene = new Scene(new BorderPane(imageView, null, null, null, backButton));

        stage.setX(screenBounds.getMinX());
        stage.setY(screenBounds.getMinY());
        stage.setWidth(screenBounds.getWidth());
        stage.setHeight(screenBounds.getHeight());
        stage.initStyle(StageStyle.UNDECORATED);
        stage.setScene(firstScene);
        stage.show();
    }
}
我在stage中设置的第一个场景(
stage.setScene(firstScene)
stage.setScene(secondScene)
)看起来不错

但在单击按钮并更改场景(从
forwardButton.setOnAction(…)
backButton.setOnAction(…)
调用事件处理程序)后,布局被破坏

正常第一场景:

正常第二场景:

第一幕:

第二幕:

我将感谢任何帮助

另外,如果有人能建议一种方法,让
ImageView
占据整个垂直空间,我也会非常感激。
但现在它被认为是一个小得多的问题

编辑1: 我通过改变窗格而不是场景来解决问题。
但我仍然想知道为什么第一次尝试没有成功

以下是更新的代码:

import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class App extends Application {
    private Scene scene;
    private Pane firstPane;
    private Pane secondPane;

    private Rectangle2D screenBounds = Screen.getPrimary().getBounds();
    private final int backButtonSize = (int) (screenBounds.getWidth() / 50);

    private Image image = new Image("https://imgur.com/download/uDlKu6Y");

    @Override
    public void start(Stage stage) {
        Button forwardButton = new Button("Forward");
        forwardButton.setOnAction(actionEvent -> scene.setRoot(secondPane));
        firstPane = new StackPane(forwardButton);

        Button backButton = new Button("Back");
        backButton.setOnAction(actionEvent -> scene.setRoot(firstPane));
        backButton.setMinWidth(backButtonSize);
        ImageView imageView = new ImageView(image);
        imageView.setFitWidth(screenBounds.getWidth() - backButtonSize);
        imageView.setFitHeight(screenBounds.getHeight());
        imageView.setPreserveRatio(true);
        secondPane = new BorderPane(imageView, null, null, null, backButton);

        scene = new Scene(firstPane);

        stage.setX(screenBounds.getMinX());
        stage.setY(screenBounds.getMinY());
        stage.setWidth(screenBounds.getWidth());
        stage.setHeight(screenBounds.getHeight());
        stage.initStyle(StageStyle.UNDECORATED);
        stage.setScene(scene);
        stage.show();
    }
}

要将您的应用程序设置为未涂层全屏,请使用:

要测试它,请使用问题中发布的mre。
按125%的比例,它看起来像:


要将应用程序设置为未涂层全屏使用:

要测试它,请使用问题中发布的mre。
按125%的比例,它看起来像:


1。对于全屏模式,使用
stage.setMaximized(真)。2.要使您的代码可供他人使用,请使用web资源。参见示例3。如何更改监视器刻度?@c0der 1。如果我使用
setMaximized()
而不是
setX()
setY()
setWidth()
setHeight()
,我会得到一些奇怪的结果(任务栏显示在第二个场景中,第一个场景变得非常小)-请参见。2.固定的。3.它是由操作系统(在我的例子中是Windows)设置的,我不会在Java方面做任何更改。对于全屏模式,使用
stage.setMaximized(真)。2.要使您的代码可供他人使用,请使用web资源。参见示例3。如何更改监视器刻度?@c0der 1。如果我使用
setMaximized()
而不是
setX()
setY()
setWidth()
setHeight()
,我会得到一些奇怪的结果(任务栏显示在第二个场景中,第一个场景变得非常小)-请参见。2.固定的。3.它是由操作系统(在我的例子中是Windows)设置的,我在Java方面没有做任何更改。这并不能修复第一个代码版本。我得到一些奇怪的结果:。这并不能修复第一个代码版本。我得到了一些奇怪的结果:。
    //stage.setX(screenBounds.getMinX());
    //stage.setY(screenBounds.getMinY());
    //stage.setWidth(screenBounds.getWidth());
    //stage.setHeight(screenBounds.getHeight());
    //stage.initStyle(StageStyle.UNDECORATED);
    stage.setFullScreen(true);