使用 JFoenix 的 JFXDialog

ARK*_*han 5 java javafx

我用的是Jfoenix,JFXDialog没有出现。

我究竟做错了什么 ?这是代码:

JFXDialogLayout content= new JFXDialogLayout();
content.setHeading(new Text("Error, No selection"));
content.setBody(new Text("No student selected"));
StackPane stackpane = new StackPane();
JFXDialog dialog =new JFXDialog(stackpane, content, JFXDialog.DialogTransition.CENTER);
JFXButton button=new JFXButton("Okay");
button.setOnAction(new EventHandler<ActionEvent>(){
    @Override
    public void handle(ActionEvent event){
        dialog.close();
    }

});
content.setActions(button);
dialog.show();
Run Code Online (Sandbox Code Playgroud)

小智 6

您正在做的是,您将 JFXDialog 添加到 StackPane 并显示您的对话框。经过

JFXDialog dialog =new JFXDialog(stackpane, content, JFXDialog.DialogTransition.CENTER);
....
....
....
dialog.show();
Run Code Online (Sandbox Code Playgroud)

实际上,这是在创建对话框的堆栈窗格内显示对话框。问题是stackpane 永远不会显示,所以对话框也永远不会显示。这就像在您的计算机关闭时尝试打开文档。

首先,这部分是完全正确的

JFXDialogLayout content= new JFXDialogLayout();
content.setHeading(new Text("Error, No selection"));
content.setBody(new Text("No student selected"));
StackPane stackpane = new StackPane();
JFXDialog dialog =new JFXDialog(stackpane, content, JFXDialog.DialogTransition.CENTER);
JFXButton button=new JFXButton("Okay");
button.setOnAction(new EventHandler<ActionEvent>(){
    @Override
    public void handle(ActionEvent event){
        dialog.close();
    }
});
content.setActions(button);
Run Code Online (Sandbox Code Playgroud)

在此之后,如果 stackpane 是您的根窗格,只需从中创建场景并分别显示 primaryStage 和 dialog(实际上您不必先显示 primaryStage 和第二个对话框,但此顺序更有意义)。

Scene scene = new Scene(stackpane, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
dialog.show();
Run Code Online (Sandbox Code Playgroud)

如果您已经有另一个根窗格,则在显示 primaryStage 和对话框之前将堆栈窗格添加到其中。

AnchorPane root = new AnchorPane();
....
.... //Some other Nodes here
JFXDialogLayout content= new JFXDialogLayout();
content.setHeading(new Text("Error, No selection"));
content.setBody(new Text("No student selected"));
StackPane stackPane = new StackPane();
JFXDialog dialog =new JFXDialog(stackPane, content, JFXDialog.DialogTransition.CENTER);
JFXButton button=new JFXButton("Okay");
button.setOnAction(new EventHandler<ActionEvent>(){
    @Override
    public void handle(ActionEvent event){
        dialog.close();
    }
});
content.setActions(button);
Scene scene = new Scene(root, 300, 250);
root.getChildren().add(stackPane);
primaryStage.setScene(scene);
primaryStage.show();
dialog.show();
Run Code Online (Sandbox Code Playgroud)

primaryStage 来自 Application 类的重写 start 方法。下面是根窗格作为stackpane 的那个

@Override
public void start(Stage primaryStage) throws Exception {

    JFXDialogLayout content= new JFXDialogLayout();
    content.setHeading(new Text("Error, No selection"));
    content.setBody(new Text("No student selected"));
    StackPane stackpane = new StackPane();
    JFXDialog dialog =new JFXDialog(stackpane, content, JFXDialog.DialogTransition.CENTER);
    JFXButton button=new JFXButton("Okay");
    button.setOnAction(new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent event){
            dialog.close();
        }
    });
    content.setActions(button);

    Scene scene = new Scene(stackpane, 300, 250);
    primaryStage.setScene(scene);
    dialog.show();
    primaryStage.show();
}
Run Code Online (Sandbox Code Playgroud)