¿Cómo crear y mostrar un diálogo común (Error, Advertencia, Confirmación) en JavaFX 2.0?

¿Cómo creo y muestro diálogos comunes (Error, Advertencia, Confirmación) en JavaFX 2.0? No puedo encontrar ninguna clase “estándar” como Dialog , DialogBox , Message o algo así.

JDK 1.8.0_40 recientemente lanzado agregó soporte para diálogos JavaFX , alertas, etc. Por ejemplo, para mostrar un diálogo de confirmación, uno usaría la clase Alert:

 Alert alert = new Alert(AlertType.CONFIRMATION, "Delete " + selection + " ?", ButtonType.YES, ButtonType.NO, ButtonType.CANCEL); alert.showAndWait(); if (alert.getResult() == ButtonType.YES) { //do stuff } 

Aquí hay una lista de clases agregadas en este lanzamiento:

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

EDITAR : el soporte de diálogo se agregó a JavaFX, consulte https://stackoverflow.com/a/28887273/1054140


No hubo soporte de diálogo común en un año 2011. Tuviste que escribirlo tú mismo creando un nuevo 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(); 

Actualizar

Los diálogos estándar oficiales están llegando a JavaFX en la versión 8u40, como parte de la implementación de RT-12643 . Estos deberían estar disponibles en formato de publicación final alrededor de marzo de 2015 y en formato de código fuente en el repository de desarrollo JavaFX .

Mientras tanto, puedes usar la solución ControlsFX a continuación …


ControlsFX es la biblioteca de facto estándar de terceros para soporte de diálogo común en JavaFX (error, advertencia, confirmación, etc.).

Existen muchas otras bibliotecas de terceros disponibles que brindan soporte de diálogo común como se señala en algunas otras respuestas y puede crear sus propios cuadros de diálogo con la suficiente facilidad utilizando el código de muestra en la respuesta de Sergey.

Sin embargo, creo que ControlsFX proporciona fácilmente los mejores diálogos JavaFX estándar de calidad disponibles en este momento. Aquí hay algunos ejemplos de la documentación de ControlsFX .

diálogo estándar

enlaces de comando

Sergey está en lo cierto, pero si necesita obtener una respuesta de su (s) diálogo (s) hilado en casa para su evaluación en el mismo bloque de código que la invocó, debe usar .showAndWait (), no .show (). Aquí está mi versión de algunos de los tipos de diálogo que se proporcionan en Swing’s 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() { @Override public void handle( ActionEvent e ) { dial.close(); buttonSelected = Response.YES; } } ); Button noButton = new Button( "No" ); noButton.setOnAction( new EventHandler() { @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() { @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(); } 

}

Adaptado de la respuesta aquí: https://stackoverflow.com/a/7505528/921224

javafx.scene.control.Alert

Para obtener una descripción detallada de cómo usar los diálogos de JavaFX, consulte: Diálogos JavaFX (oficial) por code.makery. Son mucho más potentes y flexibles que los diálogos Swing y son capaces de mucho más que solo mostrar mensajes.

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

Una cosa a tener en cuenta es que JavaFX es un conjunto de herramientas GUI de subproceso único, lo que significa que este método se debe invocar directamente desde el subproceso de la aplicación JavaFX. Si tiene otro hilo trabajando, que necesita un cuadro de diálogo, vea estos SO Q & As: JavaFX2: ¿Puedo pausar un fondo Task / Service? y Platform.Runlater y Task Javafx .

Para usar este método, llame a:

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

o

 ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE"); 
  • Puede ver la gran herramienta Los cuadros de diálogo de JavaFX son diálogos simples al estilo de JOptionPane de Swing

Puede dar un cuadro de diálogo que viene dado por el Proyecto de controles JavaFX UI . Creo que te ayudará

 Dialogs.showErrorDialog(Stage object, errorMessage, "Main line", "Name of Dialog box"); Dialogs.showWarningDialog(Stage object, errorMessage, "Main line", "Name of Dialog box"); 
 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() { @Override public void handle(ActionEvent arg0) { // TODO Auto-generated method stub dialogStage.hide(); } }); grd_pan.add(btn_ok, 0, 2); dialogStage.show(); } } 

Esto funciona desde java 8u40:

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