2012-12-04 17 views
18

Tworzę aplikację w JavaFx, w której chcę to zrobić, jeśli etap potomny jest otwierany, powinien on zostać otwarty w centrum etapu nadrzędnego. Próbuję to zrobić, używając mystage.centerOnScreen(), ale przypisuję etap podrzędny do środka ekranu, a nie środek etapu nadrzędnego. Jak mogę przypisać etap podrzędny do centrum etapu nadrzędnego?Lokalizacja w centrum sceny

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

Odpowiedz

22

Do tego celu można użyć właściwości X/Y/width/height sceny nadrzędnej. Zamiast używać Stage#centerOnScreen, można wykonać następujące czynności:

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

Jeśli nie określono jawnie szerokości i wysokości elementu childStage, można wykonać obliczenia w module obsługi zdarzeń dla zdarzenia childStage.setOnShown. – axiopisty

+0

Jak to może wyglądać dziwnie, etap potomny ma swoje rozmiary na budowie, kiedy to robię ... \t \t \t \t childStage.toBack(); \t \t childStage.show(); \t \t childStage.hide(); \t childStage.toFront(); –

1

Jeśli nie określić rozmiar dla childStage, trzeba słuchać na szerokość i wysokość zmienia się szerokość i wysokość jest nadal NaN gdy onShown nazywa .

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