Comment créer et afficher des boîtes de dialogue courantes (Erreur, Avertissement, Confirmation) dans JavaFX 2.0? Je ne trouve aucune classe "standard" comme Dialog
, DialogBox
, Message
ou quelque chose du genre.
JDK 1.8.0_40 récemment publié: ajout de prise en charge des boîtes de dialogue JavaFX , alertes, etc. Par exemple, pour afficher une boîte de dialogue de confirmation, on utilise 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:
[~ # ~] edit [~ # ~] : le support de dialogue a été ajouté à JavaFX, voir https://stackoverflow.com/ a/28887273/105414
Il n'y avait pas de support de dialogue commun en 2011. Vous deviez l'écrire vous-même en créant 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();
Mettre à jour
Les dialogues standard officiels arrivent sur JavaFX dans la version 8u40, dans le cadre de la mise en oeuvre de RT-1264 . Celles-ci devraient être disponibles sous forme finale vers le mois de 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 tierce standard defacto pour la prise en charge commune des dialogues 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 l'exemple de code fourni dans la réponse de Sergey.
Toutefois, j’estime que ControlsFX fournit facilement les dialogues JavaFX standard de la meilleure qualité actuellement disponibles. Voici quelques exemples de documentation ControlsFX .
Sergey a raison, mais si vous devez obtenir une réponse de votre/vos dialogue (s) homogène (s) à des fins d'évaluation dans le même bloc de code que celui qui l'a appelé, vous devez utiliser .showAndWait (), pas .show (). Voici mon interprétation de quelques types de dialogues 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();
}
}
Adapté de la réponse ici: https://stackoverflow.com/a/7505528/921224
Pour une description détaillée de l'utilisation des dialogues JavaFX, voir: Dialogues JavaFX (official) par code.makery. Ils sont beaucoup plus puissants et flexibles que les boîtes de dialogue Swing et capables de faire bien plus que simplement afficher 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 à l'esprit est que JavaFX est un kit d'outils à interface graphique unique, ce qui signifie que cette méthode doit être appelée directement à partir du thread d'application JavaFX. Si un autre thread fonctionne, nécessitant une boîte de dialogue, reportez-vous à ceci: SO Questions-réponses: JavaFX2: Puis-je suspendre une tâche/un service en arrière-plan? et Platform.Runlater et Javafx de tâche .
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");
Cela fonctionne depuis Java 8u40:
Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();
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();
}
}
Vous pouvez donner une boîte de dialogue qui est donnée par le Projet de contrôles d'interface utilisateur JavaFX . Je pense que ça va t'aider
Dialogs.showErrorDialog(Stage object, errorMessage, "Main line", "Name of Dialog box");
Dialogs.showWarningDialog(Stage object, errorMessage, "Main line", "Name of Dialog box");