2013-09-26 4 views
4

Je veux ouvrir une fenêtre de dialogue au-dessus du centre de la fenêtre parent, donc j'utiliser la formule suivante:JavaFX-2: comment obtenir la taille de la fenêtre si elle n'a pas été définie manuellement?

Window window = ((Node) actionEvent.getSource()).getScene().getWindow(); 
Scene scene = new Scene(new Group(new DialogWindow())); 
Stage dialog = new Stage(); 
dialog.initOwner(window); 
dialog.sizeToScene(); 

dialog.setX(stage.getX() + stage.getWidth()/2 - dialog.getWidth()/2); //dialog.getWidth() = NaN 
dialog.setY(stage.getY() + stage.getHeight()/2 - dialog.getHeight()/2); //dialog.getHeight() = NaN 

dialog.setScene(scene); 
dialog.show(); //it is better to showAndWait(); 

Je ne taille fixe pas la main parce que je besoin de la fenêtre pour dimensionner automatiquement à la taille de son contenu. Sous Linux, il positionne la fenêtre directement au centre de la fenêtre parente. Mais dans Windows cela ne fonctionne pas et conduit à des résultats différents.

Comment puis-je obtenir la largeur et la hauteur de la boîte de dialogue si je ne les ai pas définies manuellement?

Répondre

10

La largeur et la hauteur de Stage sont calculées après avoir été affichées (.show()). Faites le calcul après:

... 
dialog.show(); 
dialog.setX(stage.getX() + stage.getWidth()/2 - dialog.getWidth()/2); //dialog.getWidth() = not NaN 
dialog.setY(stage.getY() + stage.getHeight()/2 - dialog.getHeight()/2); //dialog.getHeight() = not NaN 

EDIT:
Si showAndWait() est utilisé au lieu de show(), puis depuis showAndWait() bloque l'événement appelant les calculs après la showAndWait() sont également bloqués. La seule façon de contourner le problème pourrait faire le calcul avant dans la nouvelle Runnable:

final Stage dialog = new Stage(); 
dialog.initOwner(window); 
dialog.initModality(Modality.WINDOW_MODAL); 
dialog.sizeToScene(); 
dialog.setScene(scene); 

Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
     dialog.setX(primaryStage.getX() + primaryStage.getWidth()/2 - dialog.getWidth()/2); //dialog.getWidth() = NaN 
     dialog.setY(primaryStage.getY() + primaryStage.getHeight()/2 - dialog.getHeight()/2); //dialog.getHeight() = NaN 
    } 
}); 
dialog.showAndWait(); 

Notez également sur initModality. La modalité doit être définie en cas de showAndWait(). Sinon, utiliser showAndWait() n'a aucun sens.

+0

Il fonctionne. Mais pour seulement 'show()'. Pour 'showAndWait()' il y a un problème, si la fenêtre principale a été déplacée. Si je le déplace, la boîte de dialogue apparaîtra toujours au centre de l'écran. Quoi qu'il en soit merci pour une telle solution et je vais continuer à chercher une solution pour 'showAndWait()' :) – Dragon

+0

@Dragon, s'il vous plaît voir mise à jour. –

+0

Merci beaucoup. Cela fonctionne vraiment bien. – Dragon

0

Essayez ceci:

Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds(); 
<br> System.out.println(screenBounds.getHeight()); 
<br> System.out.println(screenBounds.getWidth()); 
Questions connexes