使用JavaFX在主窗口/阶段中自定义对话框/弹出窗口

时间:2016-08-22 20:08:11

标签: java javafx javafx-8

是否可以在JavaFX中创建自定义对话框,而不是操作系统级窗口? (它将是一个弹出窗口,显示在主舞台上的其他所有内容上,不能离开应用程序窗口。)即Adobe / Apache Flex样式对话框,适合任何熟悉的人。

2 个答案:

答案 0 :(得分:1)

它实际上非常简单,无需使用第三方库:

将根容器嵌入 stackpane 并在顶部锚点窗格上,创建对话框控件(容器/容器+控件)。

为了证明我的意思,这里有一个小的fxml文件:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>


<StackPane xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: black;" />
      <AnchorPane prefHeight="200.0" prefWidth="363.0">
         <children>
            <BorderPane layoutX="84.0" layoutY="123.0" prefHeight="99.0" prefWidth="227.0" style="-fx-background-color: red;">
               <center>
                  <Button mnemonicParsing="false" text="Button" BorderPane.alignment="CENTER" />
               </center>
            </BorderPane>
         </children>
      </AnchorPane>
   </children>
</StackPane>

看起来像: enter image description here

您可以使用属性,侦听器使其可移动。它需要一些工作,这是可行的。

Bud作为jewelsea提到controlsfx已经有你需要实现的东西,如果我没记错的话他们还提供了controlfx样本jar,在那里你可以看到源代码和所有包含的东西在运行,首先看一看,如果有什么适合你的需要。从那时起实现它是非常微不足道的,当我更新到新版本的java时,我只是在使用其中一个控件时遇到了麻烦。

答案 1 :(得分:0)

您可以收听X和Y属性。这是我根据根阶段位置更新对话框的位置的方法。

public static Stage getStage() {
    return StageHelper.getStages().get(0);
}

public static void stayInRootStage(Dialog dialog) {

    Window window = dialogPane.getScene().getWindow();
    Stage mainStage = getStage();

    ChangeListener<Number> yListener = new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            double newY = mainStage.getY() + mainStage.getHeight() / 2 - dialog.getHeight() / 2;
            dialog.setY(newY);

        }
    };

    ChangeListener<Number> xListener = new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            double newX = mainStage.getX() + mainStage.getWidth() / 2 - dialog.getWidth() / 2;
            dialog.setX(newX);
        }

    };

    mainStage.getScene().getWindow().yProperty().addListener(yListener);

    mainStage.getScene().getWindow().xProperty().addListener(xListener);
}