2015-04-10 5 views
7

Я хочу сосредоточить сцену на экране.
Это то, что я пробовал:Центр сцены 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); 
    } 
} 

После вызова centerOnScreen() стадия слишком высока. Кажется, он работает неправильно. Нужно ли мне самим вычислять x и y pos? Или как правильно использовать эту функцию?

ответ

13

Реализация по умолчанию 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); 
    } 
} 
+3

так, я удивляюсь, почему (черт возьми) этот метод называется ** centerOnScreen **. Это похоже на ошибку. – Ben

+1

Нет, это не ошибка, а желаемое поведение. Вы можете прочитать комментарии в [этой теме] (https://javafx-jira.kenai.com/browse/RT-40368) – ItachiUchiha

+3

Да, я прочитал и создал комментарий там. На мой взгляд, это название методов явно вводит в заблуждение/неправильно. – Ben

Смежные вопросы