2012-12-04 25 views
18

私はJavaFxでアプリケーションを作成しています。子ステージが開かれている場合は親ステージの中央に開く必要があります。 mystage.centerOnScreen()を使用してこれを実行しようとしていますが、親ステージの中心ではなく、子ステージを画面の中心に割り当てます。 親ステージの中心に子ステージを割り当てるにはどうすればよいですか?ステージの中心の位置

private void show(Stage parentStage) { 
    mystage.initOwner(parentStage); 
    mystage.initModality(Modality.WINDOW_MODAL); 
    mystage.centerOnScreen(); 
    mystage.initStyle(StageStyle.UTILITY); 
    mystage.show(); 
} 

答えて

22

親ステージのX/Y /幅/高さのプロパティを使用して、これを行うことができます。むしろStage#centerOnScreenを使用するよりも、あなたが次のことを行うことができます:

public class CenterStage extends Application { 
    @Override 
    public void start(final Stage stage) throws Exception { 
     stage.setX(300); 
     stage.setWidth(800); 
     stage.setHeight(400); 
     stage.show(); 

     final Stage childStage = new Stage(); 
     childStage.setWidth(200); 
     childStage.setHeight(200); 
     childStage.setX(stage.getX() + stage.getWidth()/2 - childStage.getWidth()/2); 
     childStage.setY(stage.getY() + stage.getHeight()/2 - childStage.getHeight()/2); 
     childStage.show(); 
    } 

    public static void main(String[] args) { 
     Application.launch(args); 
    } 
} 
+1

childStageの幅と高さを明示的に設定しない場合は、childStage.setOnShownイベントのイベントハンドラで計算を実行できます。 – axiopisty

+0

これは私がこれを行うときに、どのように見えるかもしれませんが、子供の段階は、建設時にそのサイズを取得します... \t \t \t \t childStage.toBack(); \t \t childStage.show(); \t \t childStage.hide(); \t \t childStage.toFront(); –

1

あなたはchildStageのためにサイズを決定していない場合はonShownが呼び出されたときに、幅と高さはまだNaNであるとして、あなたは、幅と高さの変更をリッスンする必要があり。

final double midX = (parentStage.getX() + parentStage.getWidth())/2; 
final double midY = (parentStage.getY() + parentStage.getHeight())/2; 

xResized = false; 
yResized = false; 

newStage.widthProperty().addListener((observable, oldValue, newValue) -> { 
    if (!xResized && newValue.intValue() > 1) { 
     newStage.setX(midX - newValue.intValue()/2); 
     xResized = true; 
    } 
}); 

newStage.heightProperty().addListener((observable, oldValue, newValue) -> { 
    if (!yResized && newValue.intValue() > 1) { 
     newStage.setY(midY - newValue.intValue()/2); 
     yResized = true; 
    } 
}); 

newStage.show(); 
関連する問題