2012-12-04 17 views
18

JavaFx'te bir uygulama oluşturuyorum. Bunu yapmak istediğim, eğer herhangi bir alt sahne açılırsa ebeveyn sahnesinin ortasında açılmalıdır. mystage.centerOnScreen() kullanarak bunu yapmaya çalışıyorum, ancak ana sahne ortalamasının değil, ekranın ortasına alt aşama atar. Çocuk sahnesini ana sahnenin merkezine nasıl atayabilirim?Sahnenin merkezi konumu

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

cevap

22

Bunu yapmak için üst sahnenin X/Y/width/height özelliklerini kullanabilirsiniz. Aksine Stage#centerOnScreen kullanmak yerine, yapabileceği şunlardır: Eğer childStage için boyutunu belirlemek olmadığında

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

, o zaman childStage.setOnShown olayı için bir olay işleyicisi hesaplama gerçekleştirebilir. – axiopisty

+0

Bunun nasıl görünebileceğini görmek için, bu aşamada çocuk aşaması yapım aşamasında boyutlarını alır ... \t \t \t \t childStage.toBack(); \t \t childStage.show(); \t \t childStage.hide(); \t \t childStage.toFront(); –

1

, genişlik için dinlemek zorunda ve yükseklik genişlik olarak değişir ve yükseklik onShown çağrıldığında hala NaN . Açıkça childStage genişliğini ve yüksekliğini ayarlamak yoksa

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