父级舞台上的中心舞台
Posted
技术标签:
【中文标题】父级舞台上的中心舞台【英文标题】:Center stage on parent stage 【发布时间】:2012-11-22 00:53:02 【问题描述】:我正在 JavaFx 中创建一个应用程序,我想在其中执行此操作,如果任何子阶段正在打开,那么它应该在父阶段的中心打开。
我正在尝试使用mystage.centerOnScreen()
执行此操作,但它会将子阶段分配到屏幕中心,而不是父阶段的中心。
如何将子阶段分配到父阶段的中心?
private void show(Stage parentStage)
mystage.initOwner(parentStage);
mystage.initModality(Modality.WINDOW_MODAL);
mystage.centerOnScreen();
mystage.initStyle(StageStyle.UTILITY);
mystage.show();
【问题讨论】:
【参考方案1】:您可以使用父阶段的 X/Y/width/height 属性来执行此操作。除了使用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);
【讨论】:
如果您没有明确设置 childStage 的宽度和高度,那么您可以在 childStage.setOnShown 事件的事件处理程序中执行计算。 对于这看起来多么奇怪,当我这样做时,子阶段在构造时会得到它的大小...... childStage.toBack(); childStage.show(); childStage.hide(); childStage.toFront();【参考方案2】:当您没有确定 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();
【讨论】:
以上是关于父级舞台上的中心舞台的主要内容,如果未能解决你的问题,请参考以下文章
flash as3.0里怎样修改元件的缩放中心点,让缩放的中心点一直在舞台中心位置?