訊息對話方塊(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(); //顯示對話方塊,並等待對話方塊被關閉時才繼續執行之後的程式
執行結果如下:
如果想知道使用者按下了對話方塊的哪個按鈕,可以從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(); //顯示對話方塊,並等待對話方塊被關閉時才繼續執行之後的程式 }
執行結果如下:
選擇對話方塊(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 + "!"); }
執行結果如下:
文字輸入對話方塊(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 }
執行結果如下:
更高階的對話方塊用法-DialogPane
Dialog
類別的Stage使用到DialogPane
來放置控制項元件,因此可以藉由修改DialogPane
來大幅調整內建對話方塊的樣式。若要取得Dialog
的DialogPane
,可使用getDialogPane()
方法,會直接回傳DialogPane
物件。要修改DialogPane
的內容,可以使用setContent
這個方法,傳入自己製作的Node。
alert.getDialogPane().setContent(content);
可製作出如下,能顯示Exception訊息的Error Dialog:
另外也可以使用setExpandableContent
方法,同樣傳入自制的Node來建立可擴充套件與收合內容訊息的對話方塊。
alert.getDialogPane().setExpandableContent(expContent);