Как создать и показать общий диалог (ошибка, предупреждение, подтверждение) в JavaFX 2.0?

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


person Anton    schedule 29.11.2011    source источник
comment
Возможно, вы хотите посмотреть проект для личного пользования: github.com/4ntoine/JavaFxDialog/wiki   -  person BudMinton    schedule 05.09.2012


Ответы (10)


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

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

person Ali Cheaito    schedule 05.03.2015
comment
Я обнаружил, что это хорошее решение, я не нашел способа озаглавить верхнюю часть диалога, но это не имеет большого значения. Но опять же, нужно ли вам тоже...? Ваше здоровье - person Gideon Sassoon; 21.03.2016
comment
@GideonSassoon Объект оповещения можно изменить после создания. Вызов alert.setTitle() перед showAndWait() должен работать хорошо. - person Ali Cheaito; 21.03.2016
comment
Решение Excelente без включения внешних библиотек - person JorgeGarza; 24.03.2017
comment
@GideonSassoon Вы можете установить текст заголовка с помощью alert.setHeaderText("header text");, если это то, что вам нужно. - person nonybrighto; 13.04.2017
comment
Просто и точно! Мерси ^^ - person Mangue Sutcliff; 28.11.2018

EDIT: в 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();
person Sergey Grinev    schedule 29.11.2011
comment
Хм, может быть, они появятся позже, как FileChooser? Или желают каждому разработчику изобретать велосипед?) - person Anton; 01.12.2011
comment
Готовые стандартные диалоги проект для JavaFX 2.0. Работает на меня - person Anton; 09.12.2011
comment
Официальную поддержку платформы для диалогового окна оповещений можно отслеживать через javafx-jira.kenai.com/browse/ RT-12643 - person jewelsea; 25.08.2012
comment
@ Антон, можешь показать пример того, как использовать твой диалог? Благодарность! - person likejudo; 15.01.2013
comment
@Anton Smirnov Я использую ваши диалоги, опубликованные на github. Отличная работа и благо для каждого программиста JavaFX - будьте благословенны! - person likejudo; 27.03.2013
comment
Я думаю, что они не хотят использовать диалоги. Использование диалогов не является хорошей практикой. - person ceklock; 07.09.2013
comment
К сожалению, диалоги Антона не разрешены для коммерческих приложений :( - person nob; 03.07.2014
comment
VBoxBuilder устарел. Это все еще полезный ответ, хотя он мог бы сделать небольшое обновление. - person Adam Jensen; 09.09.2014
comment
Здесь показано решение, совместимое с Java 7: stackoverflow.com/questions/14168064/ - person stefan.m; 20.12.2016

Обновить

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

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


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

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

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

стандартный диалог

ссылки команд

person jewelsea    schedule 17.07.2013
comment
Проголосовали, но ссылки на документацию не видны на сайте, на который ссылаются. Также сайт говорит, что maven 8.0.2 запущен, но для меня работает только с maven 8.0.1.. и я получаю неподдерживаемую версию major.minor 52.0 при вызове Dialogs.create().message(great).showConfirm(); - person Daniel Gerson; 27.08.2013
comment
Ссылки на документацию у меня работают нормально. В настоящее время в документации указано Важное примечание: ControlsFX будет работать только с JavaFX 8.0 b102 или более поздней версии. Вероятно, вы пытаетесь запустить ControlsFX с несовместимой версией Java. Если у вас есть дополнительные проблемы, вы должны зарегистрировать их в системе отслеживания проблем ControlsFX. - person jewelsea; 27.08.2013
comment
Удачи в поиске документации для этой библиотеки. - person Ojonugwa Jude Ochalifu; 21.07.2017

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

}

person OtherBrotherDarryl    schedule 03.10.2012
comment
Пытался запустить ваш класс, но компилятор задыхается от макета - видимо, используются константы. Какой импорт вы использовали? - person likejudo; 15.01.2013
comment
Как получить ответ, т.е. какая кнопка была выбрана? переменная-член buttonSelected является частной. - person likejudo; 15.01.2013
comment
получил его для компиляции и сделал buttonSelected общедоступным, но такой вызов ничего не отображает. ` Этап stage = новый Stage(StageStyle.TRANSPARENT); FXOptionPane.showConfirmDialog(этап, Вы хотите отключиться?, мой заголовок); ` - person likejudo; 15.01.2013

Адаптировано из ответа здесь: 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. Если у вас есть другой поток, выполняющий работу, для которого требуется диалоговое окно, см. эти вопросы и ответы SO: ">JavaFX2: Могу ли я приостановить фоновую задачу/службу? и Platform.Runlater и Задание Javafx.

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

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

or

ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE");
person Troyseph    schedule 10.06.2015
comment
Пожалуйста, не публикуйте одинаковые ответы на несколько вопросов. Опубликуйте один хороший ответ, затем проголосуйте/отметьте, чтобы закрыть другие вопросы как дубликаты. Если вопрос не повторяется, адаптируйте свои ответы к вопросу. - person Martijn Pieters; 10.06.2015
comment
@MartijnPieters В исходном вопросе Swing указан как тег, но он открыт для общих диалогов Java (он был задан до того, как JavaFX действительно стал чем-то особенным), во всяком случае, контент JavaFX, который я разместил там, немного не по теме, но полезен для новичков, которые находят, что вопросы и ответы при поиске диалогов Java и не понимаете, что Swing устаревает. - person Troyseph; 10.06.2015
comment
Тем больше причин адаптировать свой ответ к контексту! - person Martijn Pieters; 10.06.2015
comment
Я нашел эту тему в Google, поэтому лучше иметь информацию прямо здесь, чем заходить в тему вопроса, чтобы увидеть нужный мне ответ. Этот ответ заслуживает большего количества голосов. - person Mateus Viccari; 16.09.2015

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

Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();
person Clairton Luz    schedule 29.04.2016
comment
Имейте в виду, что это должно выполняться в FXApplicationThread. (Например, с Platform.runLater() или подобным) - person Lerk; 21.05.2019

Обновление: JavaFX 8u40 включает простые диалоги и предупреждения! ">сообщение в блоге, в котором объясняется, как использовать официальные диалоги JavaFX!


person Khaled Lela    schedule 16.05.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");
person Rajeev Gupta    schedule 17.07.2013
comment
В JavaFX 2.x таких классов диалогов нет. - person jewelsea; 17.07.2013
comment
javafx-dialogs-0.0.3.jar Вы можете загрузить эту банку, а затем работать с тем же диалоговым окном. - person Rajeev Gupta; 24.07.2013
comment
Я отредактировал ваш пост, указав ссылку на сторонний проект диалогов JavaFX, на который ссылается Раджив. Я думаю, что это старая версия диалогов из ControlsFX. - person jewelsea; 24.07.2013

Чтобы заставить работать пример Clairton Luz, вам нужно запустить метод FXApplicationThread и вставить в метод Platform.runLater фрагмент кода:

  Platform.runLater(() -> {
                        Alert alert = new Alert(Alert.AlertType.ERROR);
                        alert.setTitle("Error Dialog");
                        alert.setHeaderText("No information.");

                        alert.showAndWait();
                    }
            );

В противном случае вы получите: java.lang.IllegalStateException: Not on FX application thread

person invzbl3    schedule 22.02.2020

person    schedule
comment
Вероятно, неплохо хотя бы объяснить, что делает ваш код; есть довольно сильные мнения о том, подходят ли ответы только для кода. - person Dennis Meng; 31.05.2014