如何在JavaFX 2.0中创建和显示常见对话框(错误,警告,确认)?

dialog javafx-2

136331 观看

9回复

818 作者的声誉

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

作者: Anton 的来源 发布者: 2011 年 11 月 29 日

回应 (9)


47

29739 作者的声誉

编辑:对话框支持已添加到JavaFX,请参阅https://stackoverflow.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();
作者: Sergey Grinev 发布者: 29.11.2011 12:09

12

140 作者的声誉

谢尔盖是正确的,但是如果你需要从你的家庭对话框中得到一个响应,以便在调用它的同一代码块中进行评估,你应该使用.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();
}

}

作者: OtherBrotherDarryl 发布者: 03.10.2012 11:04

3

3019 作者的声誉

作者: Khaled Lela 发布者: 16.05.2013 08:45

2

96 作者的声誉

您可以提供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");
作者: Rajeev Gupta 发布者: 17.07.2013 06:53

40

114727 作者的声誉

更新

官方标准对话框将在8月40日发布到JavaFX,作为RT-12643实现的一部分。这些应该在2015年3月左右以最终版本形式提供,现在以JavaFX开发库中的源代码形式提供。

在此期间,您可以使用下面的ControlsFX解决方案......


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

还有许多其他第三方库提供了常见的对话支持,正如其他一些答案中所指出的那样,您可以使用Sergey的答案中的示例代码轻松地创建自己的对话框。

但是,我相信ControlsFX可以轻松提供目前可用的最佳质量标准JavaFX对话框。以下是ControlsFX文档中的一些示例。

标准对话框

命令链接

作者: jewelsea 发布者: 17.07.2013 07:34

2

58 作者的声誉

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();

}



}
作者: ayadi 发布者: 30.05.2014 09:55

79

2712 作者的声誉

最近发布的JDK 1.8.0_40增加了对JavaFX对话框,警报等的支持。例如,要显示确认对话框,可以使用Alert类:

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

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

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

作者: Ali Cheaito 发布者: 05.03.2015 08:38

7

3169 作者的声誉

改编自答案:https//stackoverflow.com/a/7505528/921224

javafx.scene.control.Alert

有关如何使用JavaFX对话框的深入描述,请参阅:code.makery的JavaFX Dialogs(官方)。它们比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应用程序线程调用此方法。如果你有另一个线程正在工作,需要一个对话框然后看到这些问题和答案:JavaFX2:我可以暂停后台任务/服务吗?Platform.Runlater和Task Javafx

要使用此方法调用:

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

要么

ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE");
作者: Troyseph 发布者: 10.06.2015 02:07

4

826 作者的声誉

这工作自java 8u40:

Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();
作者: Clairton Luz 发布者: 29.04.2016 12:34
32x32