Як створити та показати загальне діалогове вікно (Помилка, попередження, підтвердження) у JavaFX 2.0?


74

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


Можливо, вам подобається переглянути проект для приватного використання: github.com/4ntoine/JavaFxDialog/wiki
BudMinton

Backport діалогів JavaFX 8 до JDK7: github.com/BertelSpA/openjfx-dialogs-jdk7
Паоло Фулгоні,

Відповіді:


95

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

Ось список доданих класів у цьому випуску:


Вважаючи, що це хороше рішення, я не знайшов способу назвати вершину діалогу, але не великої проблеми. Але знову ж таки, вам теж потрібно було б ...? Вітання
Гедеон Сассун

@GideonSassoon Об'єкт попередження можна змінити після створення. Виклик alert.setTitle () перед showAndWait () повинен робити добре.
Алі Чейто

Рішення Excelente без включення зовнішніх
кінцівок

@GideonSassoon Ви можете встановити текст заголовка, alert.setHeaderText("header text");якщо це те, що вам потрібно
nonybrighto

SImple et précis! Мерсі ^^
Манге Саткліфф

51

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

11
Хм, можливо, вони з’являться пізніше як FileChooser? Або вони хочуть, щоб кожен розробник винайшов колесо?)
Антон

9
Готовий стандартний проект діалогів для JavaFX 2.0. Працює для мене
Антон

2
Офіційну підтримку платформи для діалогового вікна сповіщення можна відстежити через javafx-jira.kenai.com/browse/RT-12643
jewelsea

1
@Anton, чи можете ви показати приклад використання діалогового вікна? Дякую!
likejudo

3
VBoxBuilder зараз застарілий. Це все ще корисна відповідь, хоча вона могла б зробити з невеликим оновленням.
Адам Дженсен,

40

Оновлення

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

Тим часом ви можете використовувати рішення ControlsFX нижче ...


ControlsFX - це дефакто стандартна стороння бібліотека для загальної підтримки діалогу в JavaFX (помилка, попередження, підтвердження тощо).

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

Однак я вважаю, що ControlsFX легко забезпечує найкращі якісні стандартні діалоги JavaFX, доступні на даний момент. Ось кілька зразків документації ControlsFX .

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

командні посилання


1
Голосували, але посилання на документацію не відображаються на сайті, на який посилається. Також сайт каже, що maven 8.0.2 вийшов, але для мене працює лише з maven 8.0.1 .. і я отримую "Непідтримувана major.minor версія 52.0" при виклику Dialogs.create (). Message ("great"). ShowConfirm ();
Даніель Герсон,

2
Посилання на документацію для мене добре працюють. В даний час в документації зазначено "Важливе зауваження: ControlsFX працюватиме лише на JavaFX 8.0 b102 або пізнішої версії". Ймовірно, ви намагаєтесь запустити ControlsFX на несумісній версії Java. Якщо у вас є додаткові проблеми, вам слід зареєструвати їх за допомогою контролера випусків ControlsFX .
jewelsea

Вдалого пошуку документації для цієї бібліотеки.
Ojonugwa Jude Ochalifu

12

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

}


1
Намагався запустити ваш клас, але компілятор задихається на Layout - очевидно, використовувані константи. Який імпорт ви використовували?
likejudo

Як отримати відповідь, тобто яку кнопку було обрано? змінна члена buttonSelected є приватною.
likejudo

змусив його скомпілювати і зробив buttonSelected загальнодоступним, але його виклик таким чином нічого не відображає. `Етап сцени = новий етап (StageStyle.TRANSPARENT); FXOptionPane.showConfirmDialog (етап, "Ви хочете від'єднатись?", "Мій заголовок"); `
likejudo

8

Адаптовано з відповіді тут: 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 - це набір графічних інтерфейсів з одним потоком, що означає, що цей метод слід викликати безпосередньо з потоку програми JavaFX. Якщо у вас є інший потік, який виконує роботу, для чого потрібне діалогове вікно, перегляньте ці запитання та відповіді: JavaFX2: Чи можу я призупинити фонове завдання / послугу? і Platform.Runlater і завдання Javafx .

Щоб скористатися цим методом, викличте:

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

або

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

1
Будь ласка, не публікуйте однакові відповіді на кілька запитань. Опублікуйте одну хорошу відповідь, а потім проголосуйте / позначте, щоб закрити інші запитання як дублікати. Якщо питання не є дублікатом, адаптуйте відповіді на запитання .
Мартін Пітерс

1
@MartijnPieters Оригінальне запитання визначає Swing як тег, але відкрите для загальних діалогів Java (це було задано до того, як JavaFX насправді було справжнім справою), якщо що-небудь вміст JavaFX, який я там розмістив, трохи не відповідає темі, але корисний для новачків, які вважають, що запитання та відповіді шукаючи діалоги Java і не розуміючи, що Swing застарів.
Тройсеф

Тим більше причин тоді пристосовувати свою відповідь до контексту тоді!
Мартін Пітерс

Я знайшов цю тему в Google, тому краще мати інформацію тут, ніж вводити тему запитань, щоб побачити потрібну мені відповідь. Ця відповідь заслуговує на більшу кількість голосів.
Матеус Віккарі,

5

Це працює з Java 8u40:

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

1
Майте на увазі, що це має виконуватися у FXApplicationThread. (Наприклад, з Platform.runLater()або подібним)
Лерк,


2

Ви можете вказати діалогове вікно, яке надано проектом керування інтерфейсом JavaFX . Думаю, це вам допоможе

Dialogs.showErrorDialog(Stage object, errorMessage,  "Main line", "Name of Dialog box");
Dialogs.showWarningDialog(Stage object, errorMessage,  "Main line", "Name of Dialog box");


javafx-dialogs-0.0.3.jar Ви можете завантажити цю банку, і тоді ви зможете працювати з тим самим діалоговим вікном.
Радєєв Гупта

Я відредагував вашу публікацію, посилаючись на сторонній діалоговий проект JavaFX, на який посилається Раджеєв. Я думаю, що це старіша версія діалогових вікон від ControlsFX .
jewelsea

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

}



}

3
Напевно, є гарною ідеєю хоча б пояснити, що робить ваш код; існують досить сильні думки щодо того, чи правильно відповідати лише коди.
Денніс Менг,

0

Щоб зробити приклад роботи Клертон Луз , вам потрібно запустити в 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.