2015-04-10 13 views
7

Chcę wycentrować etap na ekranie.
To co próbowałem:JavaFX środek sceny na ekranie

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

Po wywołaniu centerOnScreen() scena jest zbyt wysoka. Wygląda na to, że nie działa prawidłowo. Czy muszę samemu wyliczyć słupek x i y? Lub w jaki sposób mogę użyć tej funkcji poprawnie?

Odpowiedz

13

Domyślna implementacja centerOnScreen() jest następujący:

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

gdzie

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

centerY będą zawsze ustawione na scenie trochę wyższy niż w centrum.

Aby ustawić scenę dokładnie na środku, możesz użyć własnego zestawu dla wartości X i 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

tak, zastanawiam się, dlaczego (do cholery) ta metoda nazywa się ** centerOnScreen **. Wygląda to na rodzaj błędu. – Ben

+1

Nie, to nie błąd, ale pożądane zachowanie. Możesz przeczytać komentarze na [ten temat] (https://javafx-jira.kenai.com/browse/RT-40368) – ItachiUchiha

+3

Tak, przeczytałem i tam napisałem komentarz. W moich oczach ta nazwa metody jest wyraźnie myląca/błędna. – Ben