【问题标题】:Custom dialog/popup within main window/stage with JavaFX使用 JavaFX 在主窗口/舞台中自定义对话框/弹出窗口
【发布时间】:2016-08-22 20:08:10
【问题描述】:

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

【问题讨论】:

标签: java javafx javafx-8


【解决方案1】:

其实很简单,不需要使用 3rd 方库:

stackpane 中嵌入您的根容器,并在顶部放置 anchor pane,创建对话框控件(容器/容器+控件)。

为了说明我的意思是一个小的 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>

看起来像:

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

Bud 正如 Jewelsea 提到的,controlfx 已经实现了您需要的功能,如果我没记错的话,他们还提供了 controlfx 示例 jar,您可以在其中查看源代码和所有包含的内容,首先看看其中是否适合您需要。从那时起实现它真的很简单,当我更新到新版本的java时,我只是在过去使用他们的一个控件时遇到了麻烦。

【讨论】:

  • 并不需要它是可移动的,只要一个像这样的静态容器就可以了!
【解决方案2】:

您可以收听 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);
}

【讨论】:

    【解决方案3】:
    Dialog dialog = new Dialog();
    
    dialog.initStyle(StageStyle.UTILITY);
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2019-08-05
    • 2012-01-04
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多