JavaFX改進了以往Java的Awt和Swing函式庫實作圖形化介面(GUI, Graphical User Interface)的方式,而且還可以使用Lambda表示式來快速實作出Functional Interface,這也讓JavaFX應用程式的效能優於使用Awt和Swing函式庫做出來的Java應用程式。只是非常奇怪的是,JavaFX在一開始居然沒有內建對話框(Dialog),沒有提供像是Swing函式庫中的JOptionPane類別所提供的showMessageDialog這樣快速跳出訊息框的方法。所以要在JavaFX上顯示對話框,就只能自己製作一個對話框的Stage。



要做出對話框的Stage並不難,只是如果每次開發JavaFX應用程式時都要寫一次,那還真是麻煩。因此最好將Stage寫成可以快速進行設定,並且能夠重複使用的類別,包裝起來,供以後使用,如以下提供的MagicDialog。

Java 8 update 40之後,JavaFX已有內建各種Dialog,可參考這篇文章來使用:

使用MagicDialog快速產生對話框(Dialog)

最早的MagicDialog的確是直接建立Stage來實作出對話框的視窗,但經過一段時間的發展後,MagicDialog也已經改用Java 8 update 40之後新內建的Dialog API來產生對話框了。並且也加入了「MagicAudioPlayer」函式庫來播放音效。

取得MagicDialog

GitHub:

使用MagicDialog

MagicDialog的使用方式十分簡單,只要用Dialogs、InputDialogs或是ChoiceDialogs類別下的create方法,來串接對話框的相關設定,最後再使用show或是showAndWait方法,就能產生出訊息對話框、輸入對話框或是選擇對話框,並顯示出來。

如以下程式,可以產生出警告訊息對話框和通知訊息對話框:

Dialogs.create()
        .addButton("聯絡", () -> {
            Dialogs.create()
                    .addButton("確認", null)
                    .audio(DialogAudio.BUBUBU)
                    .fontSize(18)
                    .owner(primaryStage)
                    .message("請瀏覽這個網頁:https://magiclen.org/contact/")
                    .header("聯絡作者")
                    .title("提示")
                    .type(Dialogs.Type.INFORMATION)
                    .show();
        })
        .addButton("不聯絡", null)
        .audio(Dialogs.Audio.BUBUBU)
        .fontSize(18)
        .owner(primaryStage)
        .message("若要解決這個問題,請聯絡作者。")
        .header("發生一些問題")
        .title("警告")
        .type(Dialogs.Type.WARNING)
        .show();

magicdialog

magicdialog

如以下程式,可以產生出輸入對話框:

final String inputText = InputDialogs.create()
        .audio(DialogAudio.DIN)
        .fontSize(15)
        .owner(primaryStage)
        .message("您的第一隻寵物名稱是?")
        .header("回答以下題目")
        .title("找回密碼")
        .text("小白")
        .showAndWait();

magicdialog

如以下程式,可以產生出選擇對話框:

final String choose = ChoiceDialogs.create()
        .audio(DialogAudio.DING_H_DING_L)
        .fontSize(18)
        .owner(primaryStage)
        .message("請選取您的生肖:")
        .title("生肖選取")
        .options("鼠", "牛", "虎", "兔", "龍", "蛇", "馬", "羊", "猴", "雞", "狗", "豬")
        .defaultOption("雞")
        .showAndWait();

magicdialog

無論是Dialogs、InputDialogs還是ChoiceDialogs類別,在使用create方法時,都沒有必要把所有選項都設定過再顯示出對話框,沒有設定的選項會自動套用預設值。