如何在 JavaFX 2.0 中创建和显示通用对话框(错误、警告、确认)?

Posted

技术标签:

【中文标题】如何在 JavaFX 2.0 中创建和显示通用对话框(错误、警告、确认)?【英文标题】:How to create and show common dialog (Error, Warning, Confirmation) in JavaFX 2.0? 【发布时间】:2012-01-08 17:55:11 【问题描述】:

如何在 JavaFX 2.0 中创建和显示常见对话框(错误、警告、确认)?我找不到像DialogDialogBoxMessage 之类的任何“标准”类。

【问题讨论】:

也许你想看看私人使用的项目:github.com/4ntoine/JavaFxDialog/wiki 将 JavaFX 8 对话框向后移植到 JDK7:github.com/BertelSpA/openjfx-dialogs-jdk7 【参考方案1】:

最近发布的 JDK 1.8.0_40 添加了support for JavaFX dialogs、alerts 等。例如,要显示确认对话框,可以使用 Alert 类:

Alert alert = new Alert(AlertType.CONFIRMATION, "Delete " + selection + " ?", ButtonType.YES, ButtonType.NO, ButtonType.CANCEL);
alert.showAndWait();

if (alert.getResult() == ButtonType.YES) 
    //do stuff

这是此版本中添加的类的列表:

javafx.scene.control.Dialog javafx.scene.control.Alert javafx.scene.control.TextInputDialog javafx.scene.control.ChoiceDialog

【讨论】:

发现这是一个很好的解决方案,我没有找到一种方法来命名对话的顶部,但没什么大不了的。但是话又说回来,您是否也需要...?干杯 @GideonSassoon 警报对象创建后可以修改。在 showAndWait() 之前调用 alert.setTitle() 应该会很好。 不包括外部库的卓越解决方案 @GideonSassoon 如果您需要,可以使用alert.setHeaderText("header text"); 设置标题文本 简单而精确!谢谢^^【参考方案2】:

编辑:对话框支持已添加到 JavaFX,请参阅 https://***.com/a/28887273/1054140


2011 年没有通用对话支持。 您必须通过创建 new Stage() 自己编写:

Stage dialogStage = new Stage();
dialogStage.initModality(Modality.WINDOW_MODAL);

VBox vbox = new VBox(new Text("Hi"), new Button("Ok."));
vbox.setAlignment(Pos.CENTER);
vbox.setPadding(new Insets(15));

dialogStage.setScene(new Scene(vbox));
dialogStage.show();

【讨论】:

嗯,可能,它们以后会像FileChooser一样出现?或者他们希望每个开发者都重新发明***?) 为 JavaFX 2.0 准备的标准对话框 project。为我工作 可以通过javafx-jira.kenai.com/browse/RT-12643跟踪官方平台对Alert对话框的支持 @Anton 你能举例说明如何使用你的对话框吗?谢谢! VBoxBuilder 现在已弃用。这仍然是一个有用的答案,虽然它可以做一个小的更新。【参考方案3】:

更新

作为RT-12643 实现的一部分,官方标准对话框将在 8u40 版中加入 JavaFX。这些应该会在 2015 年 3 月左右以最终版本形式提供,现在在the JavaFX development repository 中以源代码形式提供。

与此同时,您可以使用下面的 ControlsFX 解决方案...


ControlsFX 是事实上的标准第 3 方库,用于 JavaFX 中的常见对话框支持(错误、警告、确认等)。

还有许多其他可用的 3rd 方库,它们提供了一些其他答案中指出的通用对话框支持,您可以使用 Sergey 答案中的示例代码轻松地创建自己的对话框。

但是,我相信ControlsFX 很容易提供目前可用的最优质的标准 JavaFX 对话框。以下是来自ControlsFX documentation 的一些示例。

【讨论】:

已投票,但文档链接在链接的站点上不明显。网站还说 maven 8.0.2 已经启动,但对我来说只适用于 maven 8.0.1 .. 调用 Dialogs.create().message("great").showConfirm (); 文档链接对我来说很好用。该文档当前声明“重要提示:ControlsFX 仅适用于 JavaFX 8.0 b102 或更高版本。”您可能正尝试针对不兼容的 Java 版本运行 ControlsFX。如果您还有其他问题,您应该将它们记录在ControlsFX issue tracker。 祝你好运找到这个库的文档。【参考方案4】:

Sergey 是正确的,但是如果您需要从您的自制对话框中获得响应以在调用它的同一代码块中进行评估,您应该使用 .showAndWait(),而不是 .show()。这是我对 Swing 的 OptionPane 中提供的几种对话框类型的演绎:

public class FXOptionPane 

public enum Response  NO, YES, CANCEL ;

private static Response buttonSelected = Response.CANCEL;

private static ImageView icon = new ImageView();

static class Dialog extends Stage 
    public Dialog( String title, Stage owner, Scene scene, String iconFile ) 
        setTitle( title );
        initStyle( StageStyle.UTILITY );
        initModality( Modality.APPLICATION_MODAL );
        initOwner( owner );
        setResizable( false );
        setScene( scene );
        icon.setImage( new Image( getClass().getResourceAsStream( iconFile ) ) );
    
    public void showDialog() 
        sizeToScene();
        centerOnScreen();
        showAndWait();
    


static class Message extends Text 
    public Message( String msg ) 
        super( msg );
        setWrappingWidth( 250 );
    


public static Response showConfirmDialog( Stage owner, String message, String title ) 
    VBox vb = new VBox();
    Scene scene = new Scene( vb );
    final Dialog dial = new Dialog( title, owner, scene, "res/Confirm.png" );
    vb.setPadding( new Inset(10,10,10,10) );
    vb.setSpacing( 10 );
    Button yesButton = new Button( "Yes" );
    yesButton.setOnAction( new EventHandler<ActionEvent>() 
        @Override public void handle( ActionEvent e ) 
            dial.close();
            buttonSelected = Response.YES;
        
     );
    Button noButton = new Button( "No" );
    noButton.setOnAction( new EventHandler<ActionEvent>() 
        @Override public void handle( ActionEvent e ) 
            dial.close();
            buttonSelected = Response.NO;
        
     );
    BorderPane bp = new BorderPane();
    HBox buttons = new HBox();
    buttons.setAlignment( Pos.CENTER );
    buttons.setSpacing( 10 );
    buttons.getChildren().addAll( yesButton, noButton );
    bp.setCenter( buttons );
    HBox msg = new HBox();
    msg.setSpacing( 5 );
    msg.getChildren().addAll( icon, new Message( message ) );
    vb.getChildren().addAll( msg, bp );
    dial.showDialog();
    return buttonSelected;


public static void showMessageDialog( Stage owner, String message, String title ) 
    showMessageDialog( owner, new Message( message ), title );

public static void showMessageDialog( Stage owner, Node message, String title ) 
    VBox vb = new VBox();
    Scene scene = new Scene( vb );
    final Dialog dial = new Dialog( title, owner, scene, "res/Info.png" );
    vb.setPadding( new Inset(10,10,10,10) );
    vb.setSpacing( 10 );
    Button okButton = new Button( "OK" );
    okButton.setAlignment( Pos.CENTER );
    okButton.setOnAction( new EventHandler<ActionEvent>() 
        @Override public void handle( ActionEvent e ) 
            dial.close();
        
     );
    BorderPane bp = new BorderPane();
    bp.setCenter( okButton );
    HBox msg = new HBox();
    msg.setSpacing( 5 );
    msg.getChildren().addAll( icon, message );
    vb.getChildren().addAll( msg, bp );
    dial.showDialog();

【讨论】:

试图运行你的类,但编译器在 Layout 上阻塞 - 显然是使用的常量。您使用了哪个导入? 如何获得响应,即选择了哪个按钮?成员变量 buttonSelected 是私有的。 让它编译并公开 buttonSelected 但这样调用它不会显示任何内容。 ` 舞台舞台 = 新舞台(StageStyle.TRANSPARENT); FXOptionPane.showConfirmDialog(stage, "你想断开连接吗?", "我的标题"); `【参考方案5】:

改编自这里的答案:https://***.com/a/7505528/921224

javafx.scene.control.Alert

有关如何使用 JavaFX 对话框的详细说明,请参阅:JavaFX Dialogs (official) by code.makery。它们比 Swing 对话框更强大、更灵活,而且功能远不止弹出消息。

import javafx.scene.control.Alert
import javafx.scene.control.Alert.AlertType;
import javafx.application.Platform;

public class ClassNameHere


    public static void infoBox(String infoMessage, String titleBar)
    
        /* By specifying a null headerMessage String, we cause the dialog to
           not have a header */
        infoBox(infoMessage, titleBar, null);
    

    public static void infoBox(String infoMessage, String titleBar, String headerMessage)
    
        Alert alert = new Alert(AlertType.INFORMATION);
        alert.setTitle(titleBar);
        alert.setHeaderText(headerMessage);
        alert.setContentText(infoMessage);
        alert.showAndWait();
    

要记住的一点是,JavaFX 是一个单线程 GUI 工具包,这意味着应该直接从 JavaFX 应用程序线程调用此方法。如果您有另一个线程在工作,需要一个对话框,请查看这些 SO Q&As:JavaFX2: Can I pause a background Task / Service? 和 Platform.Runlater and Task Javafx。

要使用这个方法调用:

ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE");

ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE");

【讨论】:

请不要对多个问题发布相同的答案。发布一个好的答案,然后投票/标记以关闭其他问题作为重复问题。如果问题不是重复的,调整您对该问题的回答 @MartijnPieters 原始问题将 Swing 指定为标签,但对一般 Java 对话框开放(在 JavaFX 真正成为一件事之前就被问到了),如果我在那里发布的 JavaFX 内容有点偏离主题,但对于在寻找 Java 对话框时发现 Q&A 并且没有意识到 Swing 已经过时的新手很有用。 那么更有理由根据上下文调整您的答案! 我在 google 上找到了这个主题,所以最好在这里有信息而不是输入问题主题来查看我需要的答案。这个答案值得更多投票。【参考方案6】:

这从 java 8u40 开始有效:

Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();

【讨论】:

请记住,这必须在 FXApplicationThread 中运行。 (例如Platform.runLater() 或类似的)【参考方案7】:

更新:JavaFX 8u40 包含简单的对话框和警报!请查看blog post which explains how to use the official JavaFX Dialogs!


你可以看看这个很棒的工具JavaFX Dialogs are simple dialogs in the style of JOptionPane from Swing

【讨论】:

【参考方案8】:

你可以给出JavaFX UI Controls Project给出的对话框。我想对你有帮助

Dialogs.showErrorDialog(Stage object, errorMessage,  "Main line", "Name of Dialog box");
Dialogs.showWarningDialog(Stage object, errorMessage,  "Main line", "Name of Dialog box");

【讨论】:

JavaFX 2.x中没有这样的对话框类 javafx-dialogs-0.0.3.jar 您可以下载此 jar,然后您可以使用相同的对话框。 我编辑了您的帖子以链接到 Rajeev 引用的第 3 方 JavaFX 对话框项目。我认为这是来自ControlsFX 的旧版对话框。【参考方案9】:
public myClass

private Stage dialogStage;



public void msgBox(String title)
    dialogStage = new Stage();
    GridPane grd_pan = new GridPane();
    grd_pan.setAlignment(Pos.CENTER);
    grd_pan.setHgap(10);
    grd_pan.setVgap(10);//pading
    Scene scene =new Scene(grd_pan,300,150);
    dialogStage.setScene(scene);
    dialogStage.setTitle("alert");
    dialogStage.initModality(Modality.WINDOW_MODAL);

    Label lab_alert= new Label(title);
    grd_pan.add(lab_alert, 0, 1);

    Button btn_ok = new Button("fermer");
    btn_ok.setOnAction(new EventHandler<ActionEvent>() 

        @Override
        public void handle(ActionEvent arg0) 
            // TODO Auto-generated method stub
            dialogStage.hide();

        
    );
    grd_pan.add(btn_ok, 0, 2);

    dialogStage.show();






【讨论】:

至少解释一下你的代码在做什么可能是个好主意;对于纯代码答案是否可行,存在相当强烈的意见。【参考方案10】:

要使Clairton Luz 的示例工作,您需要在FXApplicationThread 中运行并将您的代码sn-p 插入到Platform.runLater 方法中:

  Platform.runLater(() -> 
                        Alert alert = new Alert(Alert.AlertType.ERROR);
                        alert.setTitle("Error Dialog");
                        alert.setHeaderText("No information.");

                        alert.showAndWait();
                    
            );

否则,你会得到:java.lang.IllegalStateException: Not on FX application thread

【讨论】:

以上是关于如何在 JavaFX 2.0 中创建和显示通用对话框(错误、警告、确认)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Grails 2.0 中创建和检索 Cookie?

如何在 MFC 常规 DLL 中创建和使用 CFormView? (视觉工作室 2008)

如何以编程方式在 Dijit 对话框中制作和显示表单?

在 C 中创建和显示链表:程序显示不正确

如何在 Flutter 中创建和读取一组键值对(映射)以在 Firestore 中存储数据

使用 jQuery 在同一模式中创建和更新表单