【问题标题】:JavaFX center stage on screen [duplicate]屏幕上的JavaFX中心舞台[重复]
【发布时间】:2015-06-15 23:54:58
【问题描述】:

我想在屏幕上居中放置一个舞台。
这是我尝试过的:

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);
   }
}

在调用 centerOnScreen() 之后,stage 太高了。它似乎无法正常工作。我需要自己计算 x 和 y 位置吗?或者如何正确使用这个功能?

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    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);
    

    在哪里

    CENTER_ON_SCREEN_X_FRACTION = 1.0f / 2;
    CENTER_ON_SCREEN_Y_FRACTION = 1.0f / 3;
    

    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);
        }
    }
    

    【讨论】:

    • 所以,我想知道为什么(该死)这个方法被称为 centerOnScreen。它看起来像是一种错误。
    • 不,这不是错误,而是所需的行为。您可以在this thread 阅读 cmets
    • 是的,我阅读了它并在那里创建了评论。在我看来,这个方法名称显然是误导/错误的。
    • "centerOnScreen" 方法应该在 "show" 方法之后调用才能正常工作
    • 对于任何将要阅读本文的人,设置 X 和 Y 必须在展示完舞台后出现!花了一个小时才意识到
    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2013-05-14
    • 2018-09-06
    • 1970-01-01
    相关资源
    最近更新 更多