是否可以在JavaFX中创建自定义对话框,而不是操作系统级窗口? (它将是一个弹出窗口,显示在主舞台上的其他所有内容上,不能离开应用程序窗口。)即Adobe / Apache Flex样式对话框,适合任何熟悉的人。
答案 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>
您可以使用属性,侦听器使其可移动。它需要一些工作,这是可行的。
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);
}