Comment créer et afficher un dialogue commun (Erreur, Avertissement, Confirmation) dans JavaFX 2.0?

comment créer et afficher des dialogues communs (Erreur, Avertissement, Confirmation) dans JavaFX 2.0? Je ne trouve pas de cours" standard " comme Dialog , DialogBox , Message ou quelque chose comme ça.

61
demandé sur Kevin 2011-11-29 15:28:50

9 réponses

récemment publié JDK 1.8.0_40 ajouté prise en charge des dialogues JavaFX , alertes, etc. Par exemple, pour afficher un dialogue de confirmation, on utiliserait la classe Alert:

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

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

Voici une liste des classes ajoutées dans cette version:

62
répondu Ali Cheaito 2015-03-05 20:58:18

EDIT : le support de dialogue a été ajouté à JavaFX, voir https://stackoverflow.com/a/28887273/1054140


il n'y avait pas de support de dialogue commun en 2011. Vous avez dû l'écrire vous-même en créant le nouveau 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();
45
répondu Sergey Grinev 2017-05-23 12:34:44

mise à Jour

les dialogues Standard officiels arrivent à JavaFX dans la version 8u40, dans le cadre de la mise en œuvre de RT-12643 . Ceux-ci devraient être disponibles sous forme de version finale vers Mars 2015 et sous forme de code source dans le référentiel de développement JavaFX maintenant.

en attendant, vous pouvez utiliser la solution ControlsFX ci-dessous...


ControlsFX est la bibliothèque de tierce partie standard de defacto pour le support de dialogue courant dans JavaFX (erreur, avertissement, confirmation, etc).

il existe de nombreuses autres bibliothèques tierces disponibles qui fournissent un support de dialogue commun comme indiqué dans d'autres réponses et vous pouvez créer vos propres dialogues assez facilement en utilisant le code échantillon dans la réponse de Sergey.

cependant, je crois que ControlsFX fournit facilement les meilleures boîtes de dialogue JavaFX standard de qualité disponibles à l'heure actuelle. Voici quelques exemples de la documentation ControlsFX .

standard dialog

command links

40
répondu jewelsea 2014-08-18 23:53:12

Sergey est correct, mais si vous avez besoin d'obtenir une réponse à partir de votre boîte de dialogue maison pour l'évaluation dans le même bloc de code qui l'a invoqué, vous devez utiliser .showAndWait (), not .montrer.)( Voici mon rendu de quelques-uns des types de dialogue qui sont fournis dans OptionPane de Swing:

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

}

12
répondu OtherBrotherDarryl 2014-07-29 18:49:19

adapté de la réponse ici: https://stackoverflow.com/a/7505528/921224

javafx.scène.contrôle.Alert

pour une description détaillée de L'utilisation des boîtes de dialogue JavaFX, voir: boîtes de dialogue JavaFX (officielles) par code.makery. Ils sont beaucoup plus puissants et flexibles que les dialogues de Swing et capables de bien plus que de faire apparaître des messages.

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

Une chose à garder en gardant à l'esprit que JavaFX est une seule boîte à outils GUI threadée, ce qui signifie que cette méthode doit être appelée directement à partir du thread D'application JavaFX. Si vous avez un autre thread qui fonctionne, qui a besoin d'un dialogue alors voir ces questions et réponses: JavaFX2: puis-je mettre en pause une tâche / Service de fond? Plate-forme et .Runlater et tâche Javafx .

pour utiliser cette méthode, appelez:

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

ou

ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE");
7
répondu Troyseph 2017-05-23 12:03:04
3
répondu Khaled Lela 2013-05-16 08:45:11

vous pouvez donner la boîte de dialogue donnée par le JavaFX UI Controls Project . Je pense que ça va vous aider à

Dialogs.showErrorDialog(Stage object, errorMessage,  "Main line", "Name of Dialog box");
Dialogs.showWarningDialog(Stage object, errorMessage,  "Main line", "Name of Dialog box");
2
répondu Rajeev Gupta 2013-07-24 07:42:32
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();

}



}
2
répondu user3612862 2014-05-30 21:55:55

cela fonctionne depuis java 8u40:

Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK)
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE)
alert.show()
2
répondu Clairton Luz 2016-04-29 12:34:37