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