Wie erstelle und zeige ich allgemeine Dialoge (Fehler, Warnung, Bestätigung) in JavaFX 2.0? Ich kann keine „Standard“ Klassen wie finden Dialog
, DialogBox
, Message
oder so etwas.
Wie erstelle und zeige ich allgemeine Dialoge (Fehler, Warnung, Bestätigung) in JavaFX 2.0? Ich kann keine „Standard“ Klassen wie finden Dialog
, DialogBox
, Message
oder so etwas.
Antworten:
Kürzlich veröffentlichtes JDK 1.8.0_40 hat Unterstützung für JavaFX-Dialoge , Warnungen usw. hinzugefügt . Um beispielsweise ein Bestätigungsdialogfeld anzuzeigen, würde die Alert-Klasse verwendet:
Alert alert = new Alert(AlertType.CONFIRMATION, "Delete " + selection + " ?", ButtonType.YES, ButtonType.NO, ButtonType.CANCEL);
alert.showAndWait();
if (alert.getResult() == ButtonType.YES) {
//do stuff
}
Hier ist eine Liste der hinzugefügten Klassen in dieser Version:
alert.setHeaderText("header text");
wenn das ist, was Sie benötigen
BEARBEITEN : JavaFX wurde Dialogunterstützung hinzugefügt, siehe https://stackoverflow.com/a/28887273/1054140
In einem Jahr 2011 gab es keine gemeinsame Dialogunterstützung. Sie mussten diese selbst schreiben, indem Sie Folgendes erstellten 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();
Aktualisieren
Offizielle Standarddialoge kommen in Version 8u40 als Teil der Implementierung von RT-12643 zu JavaFX . Diese sollten ab März 2015 in der endgültigen Release-Form und jetzt in Quellcode-Form im JavaFX-Entwicklungs-Repository verfügbar sein .
In der Zwischenzeit können Sie die unten stehende ControlsFX-Lösung verwenden ...
ControlsFX ist die Standardbibliothek von Drittanbietern für die allgemeine Unterstützung von Dialogen in JavaFX (Fehler, Warnung, Bestätigung usw.).
Es stehen zahlreiche andere Bibliotheken von Drittanbietern zur Verfügung, die allgemeine Dialogunterstützung bieten, wie in einigen anderen Antworten dargelegt, und Sie können mithilfe des Beispielcodes in Sergeys Antwort ganz einfach Ihre eigenen Dialoge erstellen.
Ich glaube jedoch, dass ControlsFX auf einfache Weise die derzeit verfügbaren Standard-JavaFX-Standarddialoge bietet. Hier einige Beispiele aus der ControlsFX-Dokumentation .
Sergey ist korrekt, aber wenn Sie eine Antwort von Ihren selbst gesponnenen Dialogen zur Auswertung in demselben Codeblock erhalten müssen, in dem es aufgerufen wurde, sollten Sie .showAndWait () verwenden, nicht .show (). Hier ist meine Wiedergabe einiger Dialogtypen, die im Optionsfenster von Swing bereitgestellt werden:
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();
}
}}
Angepasst von der Antwort hier: https://stackoverflow.com/a/7505528/921224
Eine ausführliche Beschreibung der Verwendung von JavaFX-Dialogen finden Sie unter: JavaFX-Dialoge (offiziell) von code.makery. Sie sind viel leistungsfähiger und flexibler als Swing-Dialoge und können weit mehr als nur Nachrichten anzeigen.
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();
}
}
Beachten Sie, dass JavaFX ein Single-Threaded-GUI-Toolkit ist. Dies bedeutet, dass diese Methode direkt vom JavaFX-Anwendungsthread aufgerufen werden sollte. Wenn ein anderer Thread ausgeführt wird, für den ein Dialogfeld erforderlich ist, werden die folgenden Fragen und Antworten angezeigt: JavaFX2: Kann ich eine Hintergrundaufgabe / einen Hintergrunddienst anhalten? und Platform.Runlater und Task Javafx .
So verwenden Sie diese Methode:
ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE");
oder
ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE");
Dies funktioniert seit Java 8u40:
Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();
Platform.runLater()
oder ähnlich)
Update: JavaFX 8u40 enthält einfache Dialoge und Warnungen! Lesen Sie diesen Blog-Beitrag, in dem erklärt wird, wie die offiziellen JavaFX-Dialoge verwendet werden!
Sie können ein Dialogfeld angeben, das vom JavaFX UI Controls Project bereitgestellt wird . Ich denke, es wird dir helfen
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<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
// TODO Auto-generated method stub
dialogStage.hide();
}
});
grd_pan.add(btn_ok, 0, 2);
dialogStage.show();
}
}
Damit ein Beispiel für Clairton Luz funktioniert, müssen Sie das Code-Snippet FXApplicationThread
in der Platform.runLater
Methode ausführen und in die Methode einfügen:
Platform.runLater(() -> {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Error Dialog");
alert.setHeaderText("No information.");
alert.showAndWait();
}
);
Andernfalls erhalten Sie: java.lang.IllegalStateException: Not on FX application thread