如何在JavaFX中正确居中窗口?

如何在JavaFX中正确居中窗口?,javafx,Javafx,JavaFX提供Window.centerOnScreen()来-猜什么-在屏幕上居中显示窗口。然而,JavaFX对“屏幕中心”的定义似乎是(0.5x;0.33y)。我希望这是一个错误,但是 无论如何。是否有人想出了一个干净简单的解决方案,如何在显示窗口之前将其居中?我的第一种方法导致屏幕闪烁,因为窗口必须先显示,然后才能居中 public static void centerOnScreen(Stage stage) { stage.centerOnScreen(); stage.se

JavaFX提供Window.centerOnScreen()来-猜什么-在屏幕上居中显示窗口。然而,JavaFX对“屏幕中心”的定义似乎是(0.5x;0.33y)。我希望这是一个错误,但是

无论如何。是否有人想出了一个干净简单的解决方案,如何在显示窗口之前将其居中?我的第一种方法导致屏幕闪烁,因为窗口必须先显示,然后才能居中

public static void centerOnScreen(Stage stage) {
  stage.centerOnScreen();
  stage.setY(stage.getY() * 3f / 2f);
}
更新
我忘了说什么;我事先不知道窗口的大小,所以为了手动将其居中,我必须先显示它-是什么导致它闪烁一次。因此,我正在寻找一种解决方案,在不首先显示它的情况下将其居中显示—就像Java FX能够做到这一点一样,但方法是错误的。

在舞台显示之前,您就是这样做的:

    double width = 640;
    double height = 480;

    Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
    stage.setX((screenBounds.getWidth() - width) / 2); 
    stage.setY((screenBounds.getHeight() - height) / 2);  

    final Scene scene = new Scene( new Group(), width, height);
    stage.setScene(scene);
    stage.show();
在舞台被展示出来之后,我。E您可以使用阶段的属性:

    double width = 640;
    double height = 480;

    final Scene scene = new Scene( new Group(), width, height);
    stage.setScene(scene);
    stage.show();

    Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
    stage.setX((screenBounds.getWidth() - stage.getWidth()) / 2); 
    stage.setY((screenBounds.getHeight() - stage.getHeight()) / 2);  

如果有多个屏幕,可以使用该方法返回的屏幕对象列表手动计算位置。

响应值初始化的一般技巧是为属性创建一个侦听器,该侦听器在属性初始化时自动删除。所以你可以

    Screen screen = Screen.getPrimary();
    Rectangle2D sbounds = screen.getBounds();

    double sw = sbounds.getWidth() ;
    double sh = sbounds.getHeight();

    listenToSizeInitialization(primaryStage.widthProperty(), 
            w -> primaryStage.setX(( sw - w) /2));
    listenToSizeInitialization(primaryStage.heightProperty(), 
            h -> primaryStage.setY(( sh - h) /2));


    primaryStage.show();

private void listenToSizeInitialization(可观察到的超高值大小,
DoubleConsumer处理器){
ChangeListener listener=新的ChangeListener(){
@凌驾

public void已更改(observeValue对于此代码,您必须导入

import java.awt.Dimension;
import java.awt.Toolkit;
然后

如果您想在该阶段显示之前执行此操作,请在primaryStage.getWidth()/2处将其替换为您将在场景构造函数中传递的高度

primaryStage.setX(d.width/2-(300/2));
primaryStage.setY(d.height/2-(300/2));
Scene scene = new Scene(root , 300 ,300);

我知道这篇帖子大约在三年半前就得到了回复,但在我看来,每个人都忽视了这个问题

您只需要在
stage.show()
之后键入
stage.centerOnScreen();
,因为如果您在代码执行一次之前编写它,然后它会回到原始状态(这就是我脑海中解释的)


只是为了更新答案,我选择在显示窗口后进行居中。

谢谢,有没有办法在第一次显示窗口之前获得窗口的宽度/高度?我不知道它的大小。请参阅问题更新。您的回答非常棒。但是,我只想为我们这些新的人(包括我自己)添加一条注释。您需要确保导入是适合您的应用程序的AWT或JavaFX。干杯!我认为API方法中的导入方式看起来更好-也许这正是我在屏幕前定位自己的方式。但他们至少应该记录他们正在做的事情。看起来您并没有阅读和理解问题。
centerOnScreen()
不以屏幕为中心,这就是本文的内容。它为我做的。也许你需要更新你的eclipse文件,但问题明确地针对“在显示之前”
Dimension d= Toolkit.getDefaultToolkit().getScreenSize(); // get screen size
primaryStage.show(); //show stage because you wouldn't be able to get Height & width of the stage
primaryStage.setX(d.width/2-(primaryStage.getWidth()/2));
primaryStage.setY(d.height/2-(primaryStage.getHeight()/2));
primaryStage.setX(d.width/2-(300/2));
primaryStage.setY(d.height/2-(300/2));
Scene scene = new Scene(root , 300 ,300);
import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Screen;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        StackPane layout = new StackPane();

        primaryStage.setTitle("Kuristo: PT Test Admin System");
        primaryStage.setMinWidth(1280);
        primaryStage.setMinHeight(900);
        primaryStage.centerOnScreen();

        Scene scene = new Scene(layout);
        scene.getStylesheets().add("/styles/main.css");
        primaryStage.setScene(scene);
        primaryStage.show();

        Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
        primaryStage.setX((screenBounds.getWidth() - primaryStage.getWidth()) / 2);
        primaryStage.setY((screenBounds.getHeight() - primaryStage.getHeight()) / 2);

    }

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