Как создать и показать общий диалог (Ошибка, Предупреждение, Подтверждение) в JavaFX 2.0? - PullRequest
67 голосов
/ 29 ноября 2011

Как мне создать и показать общие диалоги (Ошибка, Предупреждение, Подтверждение) в JavaFX 2.0?Я не могу найти "стандартные" классы, такие как Dialog, DialogBox, Message или что-то еще.

Ответы [ 9 ]

79 голосов
/ 05 марта 2015

Недавно выпущенный 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
}

Вот список добавленных классов в этом выпуске:

47 голосов
/ 29 ноября 2011

РЕДАКТИРОВАТЬ : в 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();
40 голосов
/ 17 июля 2013

Обновление

Официальные стандартные диалоги появятся в JavaFX в выпуске 8u40 в рамках реализации RT-12643 . Они должны быть доступны в окончательной форме выпуска примерно в марте 2015 года и в форме исходного кода в репозитории разработки JavaFX сейчас.

Тем временем вы можете использовать решение ControlsFX ниже ...


ControlsFX - это стандартная сторонняя библиотека по умолчанию для поддержки общего диалога в JavaFX (ошибка, предупреждение, подтверждение и т. Д.).

Существует множество других сторонних библиотек, которые обеспечивают общую поддержку диалогов, как указано в некоторых других ответах, и вы можете достаточно легко создавать свои собственные диалоговые окна, используя пример кода в ответе Сергея.

Тем не менее, я считаю, что ControlsFX легко обеспечивают стандартные диалоговые окна JavaFX самого высокого качества, доступные на данный момент. Вот несколько примеров из документации ControlsFX .

standard dialog

command links

12 голосов
/ 04 октября 2012

Сергей верен, но если вам нужно получить ответ из диалогового окна home-spun для оценки в том же блоке кода, который его вызвал, вы должны использовать .showAndWait (), а не .show (). Вот мое представление нескольких типов диалогов, представленных в OptionPane в 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();
}

}

7 голосов
/ 10 июня 2015

Адаптировано из ответа здесь: https://stackoverflow.com/a/7505528/921224

javafx.scene.control.Alert

Подробное описание использования диалогов JavaFX см. В: Диалоги JavaFX (официальные) от code.makery. Они гораздо более мощные и гибкие, чем диалоги 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 и задача Javafx .

Чтобы использовать этот вызов метода:

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

или

ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE");
4 голосов
/ 29 апреля 2016

Это работает с Java 8u40:

Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();
3 голосов
/ 16 мая 2013
2 голосов
/ 31 мая 2014
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 голосов
/ 17 июля 2013

Вы можете задать диалоговое окно, которое задается 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");
...