JavaFX - 如何将JFXpopup集中在舞台和弹出窗口的动态大小上

时间:2018-06-13 19:46:51

标签: java javafx jfoenix

我想在屏幕中央制作一个JFXpopup,动态宽度为&高度。这就是我目前所拥有的:

Application first look 这是应用程序的第一眼。要打开弹出窗口,我必须单击上下文菜单中的项目:

context menu 之后你会看到弹出窗口: popup

弹出窗口以x轴为中心,但显然不在y轴上。此外,当我调整舞台大小并重新打开弹出窗口时,大小不会改变。 popup2

现在有些代码:

contextMenu.getNewLeaf().setOnAction(event -> {
            popup.setPopupContent(createRegistrationFormPane());

            popup.setAutoFix(true);

            double width = globals.getPrimaryStage().getWidth() / 1.5;
            double height = globals.getPrimaryStage().getHeight() / 1.5;

            System.out.println("stage - width: " + globals.getPrimaryStage().getWidth() + "height: " + globals.getPrimaryStage().getHeight());
            System.out.println("width: " + width + " height: " + height);

            popup.getPopupContent().setPrefWidth(width);
            popup.getPopupContent().setPrefHeight(height);

            double anchorX = (globals.getPrimaryStage().getWidth() - width) / 2;
            double anchorY = (globals.getPrimaryStage().getHeight() - height) / 2;

            popup.show(rootPane, JFXPopup.PopupVPosition.TOP, JFXPopup.PopupHPosition.LEFT, anchorX, anchorY);

            item.getChildren().add(new TreeItem<>(new Twitter()));
            contextMenu.freeActionListeners();
        });

globals.getPrimaryStage()返回舞台 rootPane是......第一个窗格。

以下是system.out.println()

中的一些值
stage - width: 800.0height: 550.4000244140625
width: 533.3333333333334 height: 366.933349609375

stage - width: 1339.199951171875height: 684.7999877929688  
width: 892.7999674479166 height: 456.5333251953125

正如您所看到的,这些值会发生变化,但弹出窗口的大小不会改变。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以使用initOwner()方法将弹出窗口置于其父窗口中心,假设popup 是一个阶段:

popup.initOwner(globals.getPrimaryStage())

看起来每次调用操作时都会创建一个新的popup,并根据primaryStage大小设置大小。如果您希望它记住您自己的尺寸,则需要在popup关闭时保留这些尺寸。

答案 1 :(得分:0)

首先,我注意到获得载物台高度包括顶栏(-[] X)。这就是为什么弹出窗口无法正确垂直居中的原因。为了解决这个问题,我添加了.getScene(),然后添加了.getHeight()

第二,我现在将更改添加到以下内容: 我这样做是为了在单击按钮时创建弹出窗口。因此,除了制作1个jfxpopup之外,我只是重写指向弹出窗口的指针,然后让垃圾回收器完成其余的工作。

// Option add new leaf
CONTEXT_MENU.getNewLeaf().setOnAction(event -> {
  popup = new JFXPopup();
  try {
    popup.setPopupContent((Region) UTIL
        .getPopupView(UTIL.getView("view/application/popup/FormTest.fxml"), popup));
  } catch (IOException e) {
    e.printStackTrace();
  }
  popup.setAutoFix(true);
  // Width & height of the popup
  double width = GLOBALS.getPrimaryStage().getScene().getWidth() / 1.5;
  double height = GLOBALS.getPrimaryStage().getScene().getHeight() / 1.5;
  popup.getPopupContent().setPrefWidth(width);
  popup.getPopupContent().setPrefHeight(height);
  // X & y axis of the popup
  double anchorX = (GLOBALS.getPrimaryStage().getScene().getWidth() - width) / 2;
  double anchorY = (GLOBALS.getPrimaryStage().getScene().getHeight() - height) / 2;
  popup.show(ROOT_PANE, JFXPopup.PopupVPosition.TOP, JFXPopup.PopupHPosition.LEFT, anchorX,
      anchorY);
  item.getChildren().add(new TreeItem<>(new Twitter()));
  CONTEXT_MENU.freeActionListeners();
});

1个问题:当我说popup.hide()时,是否删除该弹出窗口的实例?现在,我只是让垃圾收集器执行其操作。只是好奇。