JavaFX 如何使用內建的對話方塊

psy5choit發表於2024-08-03

訊息對話方塊(Alert)

JavaFX的Alert類別其實就是我們熟知的MessageDialog,根據訊息型別的不同,分為幾種不同的AlertType,在顯示時也會有不同的圖示以及不同的按鈕。分類可列表如下:

  • None:不分類的訊息。常用於顯示使用說明。
  • Information:一般的提示訊息。常用於提示目前程式執行的狀態,以及回傳的正確結果。
  • Warning:警告訊息。常用於顯示程式遇到了一些不正常但無重大影響的問題。
  • Error:錯誤訊息。常用於顯示程式遇到的嚴重錯誤。
  • Confirmation:確認訊息。常用於再次確認使用者想要進行的動作。

建立Alert對話方塊的方式很簡單,程式如下:

Alert alert = new Alert(AlertType.INFORMATION); // 實體化Alert對話方塊物件,並直接在建構子設定對話方塊的訊息型別
alert.setTitle("小提示"); //設定對話方塊視窗的標題列文字
alert.setHeaderText("現在該做什麼?"); //設定對話方塊視窗裡的標頭文字。若設為空字串,則表示無標頭
alert.setContentText("請按下「確定」按鈕。"); //設定對話方塊的訊息文字
alert.showAndWait(); //顯示對話方塊,並等待對話方塊被關閉時才繼續執行之後的程式

執行結果如下:

JavaFX 如何使用內建的對話方塊

如果想知道使用者按下了對話方塊的哪個按鈕,可以從showAndWait方法的傳回值來取得Optional物件所帶的ButtonType,或是在對話方塊被關閉後,使用getResult方法直接取得ButtonType。以確認訊息來舉例的話,程式如下:

final Alert alert = new Alert(AlertType.CONFIRMATION); // 實體化Alert對話方塊物件,並直接在建構子設定對話方塊的訊息型別
alert.setTitle("MagicLen 範例程式"); //設定對話方塊視窗的標題列文字
alert.setHeaderText(""); //設定對話方塊視窗裡的標頭文字。若設為空字串,則表示無標頭
alert.setContentText("您真的要結束程式嗎?"); //設定對話方塊的訊息文字
final Optional<ButtonType> opt = alert.showAndWait();
final ButtonType rtn = opt.get(); //可以直接用「alert.getResult()」來取代
System.out.println(rtn);
if (rtn == ButtonType.OK) {
    //若使用者按下「確定」
    Platform.exit(); // 結束程式
} else if(rtn == ButtonType.CANCEL){
    //若使用者按下「取消」,也可直接使用else
    final Alert alert2 = new Alert(AlertType.INFORMATION); // 實體化Alert對話方塊物件,並直接在建構子設定對話方塊的訊息型別
    alert2.setTitle("小提示"); //設定對話方塊視窗的標題列文字
    alert2.setHeaderText("現在該做什麼?"); //設定對話方塊視窗裡的標頭文字。若設為空字串,則表示無標頭
    alert2.setContentText("請按下「確定」按鈕。"); //設定對話方塊的訊息文字
    alert2.showAndWait(); //顯示對話方塊,並等待對話方塊被關閉時才繼續執行之後的程式
}

執行結果如下:

JavaFX 如何使用內建的對話方塊

選擇對話方塊(ChoiceDialog)

選擇對話方塊算是一個蠻特別的存在,設計師可以將任何物件加入這個對話方塊內,被加入的物件會在這對話方塊內被轉成字串,並且顯示在下拉式選單(ComboBox)中,用法如下:

final ChoiceDialog<String> choiceDialog = new ChoiceDialog("雞","鼠","牛","虎","兔","龍","蛇","馬","羊","猴","雞","狗","豬"); // 實體化ChoiceDialog物件,並直接在建構子設定對話方塊選單的內容。注意這裡將泛型指定為String,所以ChoiceDialog可傳入String物件,也會回傳被選擇的String物件
choiceDialog.setTitle("生肖選取"); //設定對話方塊視窗的標題列文字
choiceDialog.setHeaderText(""); //設定對話方塊視窗裡的標頭文字。若設為空字串,則表示無標頭
choiceDialog.setContentText("請選取您的生肖:"); //設定對話方塊的訊息文字
final Optional<String> opt = choiceDialog.showAndWait(); //顯示對話方塊,並等待對話方塊被關閉時才繼續執行之後的程式
String rtn;
try {
    rtn = opt.get(); //可以直接用「choiceDialog.getResult()」來取代
} catch (final NoSuchElementException ex) {
    rtn = null;
}
if (rtn == null) {
    //沒有選擇生肖,而是直接關閉對話方塊
    System.out.println("沒有選擇生肖");
} else {
    System.out.println("您屬" + rtn + "!");
}

執行結果如下:

JavaFX 如何使用內建的對話方塊

文字輸入對話方塊(TextInputDialog)

跳出一個對話方塊要使用者輸入文字算是一個蠻常見的功能,在JavaFX中便有內建這樣的輸入對話方塊,用法如下:

 1 final TextInputDialog textInputDialog = new TextInputDialog("小白"); // 實體化TextInputDialog物件,並直接在建構子設定預設的文字內容。由於輸入一定是字串,所以對話方塊會直接回傳String物件,而不使用泛型
 2 textInputDialog.setTitle("找回密碼"); //設定對話方塊視窗的標題列文字
 3 textInputDialog.setHeaderText("回答以下題目"); //設定對話方塊視窗裡的標頭文字。若設為空字串,則表示無標頭
 4 textInputDialog.setContentText("您第一隻寵物的名字是?"); //設定對話方塊的訊息文字
 5 final Optional<String> opt = textInputDialog.showAndWait(); //顯示對話方塊,並等待對話方塊被關閉時才繼續執行之後的程式。
 6 String rtn;
 7 try{
 8     rtn = opt.get(); //可以直接用「textInputDialog.getResult()」來取代
 9 }catch(final NoSuchElementException ex){
10     rtn = null;
11 }
12 if(rtn == null){
13     //沒有確認輸入文字,而是直接關閉對話方塊
14     System.out.println("沒有回答");
15 }else{
16     System.out.println("您的回答是:" + rtn);
17 }

執行結果如下:

JavaFX 如何使用內建的對話方塊

更高階的對話方塊用法-DialogPane

Dialog類別的Stage使用到DialogPane來放置控制項元件,因此可以藉由修改DialogPane來大幅調整內建對話方塊的樣式。若要取得DialogDialogPane,可使用getDialogPane()方法,會直接回傳DialogPane物件。要修改DialogPane的內容,可以使用setContent這個方法,傳入自己製作的Node。

alert.getDialogPane().setContent(content);

可製作出如下,能顯示Exception訊息的Error Dialog:

JavaFX 如何使用內建的對話方塊

另外也可以使用setExpandableContent方法,同樣傳入自制的Node來建立可擴充套件與收合內容訊息的對話方塊。

alert.getDialogPane().setExpandableContent(expContent);

相關文章