2013-09-26 95 views
4

我想开上面它的父窗口的中心的对话窗口,所以我用下面的公式:JavaFX-2:如果没有手动设置窗口大小,如何获取窗口大小?

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

我没有设置大小的手动,因为我需要的窗口中自动调整大小的其内容的大小。

在Linux下,它直接在父窗口的中心设置窗口。但在Windows中,它不起作用并导致不同的结果。

如果我没有手动设置它们,我如何获得对话框的宽度和高度?

回答

10

Stage的宽度和高度在显示后计算(.show())。做计算后:

... 
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 

编辑:
如果showAndWait()代替show(),则由于showAndWait()阻塞调用者事件showAndWait()后的计算也被阻止。也

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

注上initModality:解决方法的一种方式可以在新Runnable之前做计算。模式必须在showAndWait()的情况下设置。否则使用showAndWait()是没有意义的。

+0

它的工作原理。但只有'show()'。对于'showAndWait()',如果移动了主窗口,则会出现问题。如果我把它放在一边,对话框仍然会出现在屏幕的中心。无论如何感谢这样的解决方案,我会继续寻求'showAndWait()':) – Dragon

+0

@Dragon的解决方案,请参阅更新。 –

+0

非常感谢。它真的很棒。 – Dragon

0

试试这个:

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