JavaFX中心舞台在屏幕上

Lar*_*ars 9 java javafx

我想在屏幕上居中.
这就是我尝试过的:

public class Test extends Application
{
   @Override
   public void start(final Stage primaryStage)
   {
       Button btn = new Button();
       btn.setText("Say 'Hello World'");
       btn.setOnAction(new EventHandler<ActionEvent>()
       {
          @Override
          public void handle(ActionEvent event)
          {
            System.out.println("Hello World!");
          }
        });
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.centerOnScreen();
        primaryStage.show();
   }

   public static void main(String[] args)
   {
       launch(args);
   }
}
Run Code Online (Sandbox Code Playgroud)

调用centerOnScreen()后,舞台太高了.它似乎没有正常工作.我是否需要自己制作x和y pos?或者我该如何正确使用此功能?

Ita*_*iha 18

默认实现centerOnScreen()如下:

Rectangle2D bounds = getWindowScreen().getVisualBounds();
double centerX = bounds.getMinX() + (bounds.getWidth() - getWidth())
                                           * CENTER_ON_SCREEN_X_FRACTION;
double centerY = bounds.getMinY() + (bounds.getHeight() - getHeight())
                                           * CENTER_ON_SCREEN_Y_FRACTION;
x.set(centerX);
y.set(centerY);
Run Code Online (Sandbox Code Playgroud)

哪里

CENTER_ON_SCREEN_X_FRACTION = 1.0f / 2;
CENTER_ON_SCREEN_Y_FRACTION = 1.0f / 3;
Run Code Online (Sandbox Code Playgroud)

centerY 总会把舞台设置得比中心高一点.

要将舞台定位在准确的中心,您可以使用您设置的自定义X和Y值.

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {

        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction((ActionEvent event) -> {
                System.out.println("Hello World!");
        });
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
        Rectangle2D primScreenBounds = Screen.getPrimary().getVisualBounds();
        primaryStage.setX((primScreenBounds.getWidth() - primaryStage.getWidth()) / 2);
        primaryStage.setY((primScreenBounds.getHeight() - primaryStage.getHeight()) / 2);
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 所以,我想知道为什么(地狱)这个方法被称为**centerOnScreen**.它看起来像一种bug. (3认同)
  • 是的,我读了它并在那里发表了评论.在我看来,这种方法名称显然是误导/错误. (3认同)
  • 应该在"show"方法之后调用"centerOnScreen"方法才能使其正常工作 (3认同)
  • 对于任何想要读到这篇文章的人来说,设置 X 和 Y 必须在展示舞台之后出现!花了一个小时才意识到 (2认同)