java fx dialog_JavaFX 如何使用內建的對話框(Dialog)?
JavaFX改進(jìn)了以往Java的Awt和Swing函式庫(kù)實(shí)作圖形化介面(GUI, Graphical User Interface)的方式,而且還可以使用Lambda表示式來快速實(shí)作出Functional Interface,這也讓JavaFX應(yīng)用程式的效能優(yōu)於使用Awt和Swing函式庫(kù)做出來的Java應(yīng)用程式。只是非常奇怪的是,JavaFX在一開始的時(shí)候居然沒有內(nèi)建對(duì)話框(Dialog),沒有提供像是Swing函式庫(kù)中的JOptionPane類別所提供的showMessageDialog這樣快速跳出訊息框的方法。因此,以往要在JavaFX上顯示對(duì)話框,就只能自己製作一個(gè)對(duì)話框的Stage。
還好,這樣的情況到了Java 8 Update 40之後,官方終於在JavaFX內(nèi)新增了DialogPane與Dialog類別,並預(yù)設(shè)實(shí)作了基本的資訊(Information)、警告(Warning)、錯(cuò)誤(Error)、確認(rèn)(Confirmation)的訊息對(duì)話框(Alert)和選擇物件的選擇對(duì)話框(ChoiceDialog),以及能輸入文字的文字輸入對(duì)話框(TextInputDialog)。底下就讓我們來看看這些對(duì)話框的使用方法。
JavaFX的內(nèi)建對(duì)話框全都繼承Dialog這個(gè)類別,在個(gè)別介紹JavaFX內(nèi)建對(duì)話框的用法之前,須注意到JavaFX的Dialog類別雖是一個(gè)獨(dú)立的對(duì)話框視窗,但卻是位於javafx.scene.control套件內(nèi),而非javafx.stage套件,而且也沒有繼承Control這個(gè)抽象類別,所以Dialog不是Node(Dialog is not a Node),因此別想將Dialog當(dāng)作是控制項(xiàng)元件來加入到別的視窗或是容器中。Dialog類別內(nèi)有使用到HeavyweightDialog這個(gè)非公開類別,裡面已經(jīng)實(shí)作好對(duì)話框的Stage了。
若您還不清楚什麼是Stage、什麼是Node,請(qǐng)先參考底下兩篇文章:
訊息對(duì)話框(Alert)
JavaFX的Alert類別其實(shí)就是我們熟知的MessageDialog,根據(jù)訊息類型的不同,分為幾種不同的AlertType,在顯示時(shí)也會(huì)有不同的圖示以及不同的按鈕。分類可列表如下: None:不分類的訊息。常用於顯示使用說明。
Information:一般的提示訊息。常用於提示目前程式執(zhí)行的狀態(tài),以及回傳的正確結(jié)果。
Warning:警告訊息。常用於顯示程式遇到了一些不正常但無重大影響的問題。
Error:錯(cuò)誤訊息。常用於顯示程式遇到的嚴(yán)重錯(cuò)誤。
Confirmation:確認(rèn)訊息。常用於再次確認(rèn)使用者想要進(jìn)行的動(dòng)作。
建立Alert對(duì)話框的方式很簡(jiǎn)單,程式如下: final Alert alert = new Alert(AlertType.INFORMATION); // 實(shí)體化Alert對(duì)話框物件,並直接在建構(gòu)子設(shè)定對(duì)話框的訊息類型
alert.setTitle("小提示"); //設(shè)定對(duì)話框視窗的標(biāo)題列文字
alert.setHeaderText("現(xiàn)在該做什麼?"); //設(shè)定對(duì)話框視窗裡的標(biāo)頭文字。若設(shè)為空字串,則表示無標(biāo)頭
alert.setContentText("請(qǐng)按下「確定」按鈕。"); //設(shè)定對(duì)話框的訊息文字
alert.showAndWait(); //顯示對(duì)話框,並等待對(duì)話框被關(guān)閉時(shí)才繼續(xù)執(zhí)行之後的程式
執(zhí)行結(jié)果如下:
如果想知道使用者按下了對(duì)話框的哪個(gè)按鈕,可以從showAndWait方法的傳回值來取得Optional物件所帶的ButtonType,或是在對(duì)話框被關(guān)閉後,使用getResult方法直接取得ButtonType。以確認(rèn)訊息來舉例的話,程式如下: final Alert alert = new Alert(AlertType.CONFIRMATION); // 實(shí)體化Alert對(duì)話框物件,並直接在建構(gòu)子設(shè)定對(duì)話框的訊息類型
alert.setTitle("MagicLen 範(fàn)例程式"); //設(shè)定對(duì)話框視窗的標(biāo)題列文字
alert.setHeaderText(""); //設(shè)定對(duì)話框視窗裡的標(biāo)頭文字。若設(shè)為空字串,則表示無標(biāo)頭
alert.setContentText("您真的要結(jié)束程式嗎?"); //設(shè)定對(duì)話框的訊息文字
final Optional opt = alert.showAndWait();
final ButtonType rtn = opt.get(); //可以直接用「alert.getResult()」來取代
System.out.println(rtn);
if (rtn == ButtonType.OK) {
//若使用者按下「確定」
Platform.exit(); // 結(jié)束程式
} else if(rtn == ButtonType.CANCEL){
//若使用者按下「取消」,也可直接使用else
final Alert alert2 = new Alert(AlertType.INFORMATION); // 實(shí)體化Alert對(duì)話框物件,並直接在建構(gòu)子設(shè)定對(duì)話框的訊息類型
alert2.setTitle("小提示"); //設(shè)定對(duì)話框視窗的標(biāo)題列文字
alert2.setHeaderText("現(xiàn)在該做什麼?"); //設(shè)定對(duì)話框視窗裡的標(biāo)頭文字。若設(shè)為空字串,則表示無標(biāo)頭
alert2.setContentText("請(qǐng)按下「確定」按鈕。"); //設(shè)定對(duì)話框的訊息文字
alert2.showAndWait(); //顯示對(duì)話框,並等待對(duì)話框被關(guān)閉時(shí)才繼續(xù)執(zhí)行之後的程式
}
執(zhí)行結(jié)果如下:
如果想自訂對(duì)話框的按鈕,可以在實(shí)體化Alert時(shí),將ButtonType以Varargs的方式作為建構(gòu)子的參數(shù),例如將Confirmation對(duì)話框按鈕改成「是、否」按鈕,可以將以上程式改成: final Alert alert = new Alert(AlertType.CONFIRMATION, "您真的要結(jié)束程式嗎?", ButtonType.YES, ButtonType.NO); // 實(shí)體化Alert對(duì)話框物件,並直接在建構(gòu)子設(shè)定對(duì)話框的訊息類型、文字和按鈕
alert.setTitle("MagicLen 範(fàn)例程式"); //設(shè)定對(duì)話框視窗的標(biāo)題列文字
alert.setHeaderText(""); //設(shè)定對(duì)話框視窗裡的標(biāo)頭文字。若設(shè)為空字串,則表示無標(biāo)頭
final Optional opt = alert.showAndWait();
final ButtonType rtn = opt.get(); //可以直接用「alert.getResult()」來取代
System.out.println(rtn);
if (rtn == ButtonType.YES) {
//若使用者按下「是」
Platform.exit(); // 結(jié)束程式
} else if (rtn == ButtonType.NO) {
//若使用者按下「否」,也可直接使用else
final Alert alert2 = new Alert(AlertType.INFORMATION); // 實(shí)體化Alert對(duì)話框物件,並直接在建構(gòu)子設(shè)定對(duì)話框的訊息類型
alert2.setTitle("小提示"); //設(shè)定對(duì)話框視窗的標(biāo)題列文字
alert2.setHeaderText("現(xiàn)在該做什麼?"); //設(shè)定對(duì)話框視窗裡的標(biāo)頭文字。若設(shè)為空字串,則表示無標(biāo)頭
alert2.setContentText("請(qǐng)按下「確定」按鈕。"); //設(shè)定對(duì)話框的訊息文字
alert2.showAndWait(); //顯示對(duì)話框,並等待對(duì)話框被關(guān)閉時(shí)才繼續(xù)執(zhí)行之後的程式
}
執(zhí)行結(jié)果如下:
選擇對(duì)話框(ChoiceDialog)
選擇對(duì)話框算是一個(gè)蠻特別的存在,設(shè)計(jì)師可以將任何物件加入這個(gè)對(duì)話框內(nèi),被加入的物件會(huì)在這對(duì)話框內(nèi)被轉(zhuǎn)成字串(toString),並且顯示在下拉式選單(ComboBox)中,用法如下: final ChoiceDialog choiceDialog = new ChoiceDialog("雞","鼠","牛","虎","兔","龍","蛇","馬","羊","猴","雞","狗","豬"); // 實(shí)體化ChoiceDialog物件,並直接在建構(gòu)子設(shè)定對(duì)話框選單的內(nèi)容。注意這裡將泛型指定為String,所以ChoiceDialog可傳入String物件,也會(huì)回傳被選擇的String物件
choiceDialog.setTitle("生肖選取"); //設(shè)定對(duì)話框視窗的標(biāo)題列文字
choiceDialog.setHeaderText(""); //設(shè)定對(duì)話框視窗裡的標(biāo)頭文字。若設(shè)為空字串,則表示無標(biāo)頭
choiceDialog.setContentText("請(qǐng)選取您的生肖:"); //設(shè)定對(duì)話框的訊息文字
final Optional opt = choiceDialog.showAndWait(); //顯示對(duì)話框,並等待對(duì)話框被關(guān)閉時(shí)才繼續(xù)執(zhí)行之後的程式
String rtn;
try{
rtn = opt.get(); //可以直接用「choiceDialog.getResult()」來取代
}catch(final NoSuchElementException ex){
rtn = null;
}
if(rtn == null){
//沒有選擇生肖,而是直接關(guān)閉對(duì)話框
System.out.println("沒有選擇生肖");
}else{
System.out.println("您屬" + rtn + "!");
}
執(zhí)行結(jié)果如下:
文字輸入對(duì)話框(TextInputDialog)
跳出一個(gè)對(duì)話框要使用者輸入文字算是一個(gè)蠻常見的功能,在JavaFX中便有內(nèi)建這樣的輸入對(duì)話框,用法如下: final TextInputDialog textInputDialog = new TextInputDialog("小白"); // 實(shí)體化TextInputDialog物件,並直接在建構(gòu)子設(shè)定預(yù)設(shè)的文字內(nèi)容。由於輸入一定是字串,所以對(duì)話框會(huì)直接回傳String物件,而不使用泛型
textInputDialog.setTitle("找回密碼"); //設(shè)定對(duì)話框視窗的標(biāo)題列文字
textInputDialog.setHeaderText("回答以下題目"); //設(shè)定對(duì)話框視窗裡的標(biāo)頭文字。若設(shè)為空字串,則表示無標(biāo)頭
textInputDialog.setContentText("您第一隻寵物的名字是?"); //設(shè)定對(duì)話框的訊息文字
final Optional opt = textInputDialog.showAndWait(); //顯示對(duì)話框,並等待對(duì)話框被關(guān)閉時(shí)才繼續(xù)執(zhí)行之後的程式。
String rtn;
try{
rtn = opt.get(); //可以直接用「textInputDialog.getResult()」來取代
}catch(final NoSuchElementException ex){
rtn = null;
}
if(rtn == null){
//沒有確認(rèn)輸入文字,而是直接關(guān)閉對(duì)話框
System.out.println("沒有回答");
}else{
System.out.println("您的回答是:" + rtn);
}
執(zhí)行結(jié)果如下:
更進(jìn)階的對(duì)話框用法-DialogPane
Dialog類別的Stage使用到DialogPane來放置控制項(xiàng)元件,因此可以藉由修改DialogPane來大幅調(diào)整內(nèi)建對(duì)話框的樣式。若要取得Dialog的DialogPane,可使用getDialogPane()方法,會(huì)直接回傳DialogPane物件。要修改DialogPane的內(nèi)容,可以使用setContent這個(gè)方法,傳入自己製作的Node。 alert.getDialogPane().setContent(content);
可製作出如下,能顯示Exception訊息的Error Dialog:
另外也可以使用setExpandableContent方法,同樣傳入自製的Node來建立可擴(kuò)展與收合內(nèi)容訊息的對(duì)話框。 alert.getDialogPane().setExpandableContent(expContent);
已知的對(duì)話框問題
由於JavaFX的Dialog在Java 8 update 40才出現(xiàn),所以在這之前的JavaFX版本都無法支援有使用到Dialog的JavaFX App。而且這版本的Dialog似乎還有很多Bug待解決,其中比較嚴(yán)重的是在某些平臺(tái)下,Dialog的Resize和Redraw的功能無法使用,所以建議不要塞太多內(nèi)容在Dialog中,上面提到的DialogPane的setExpandableContent方法也儘量不要使用,以免出現(xiàn)如以下視窗元件走位,以及內(nèi)容顯示不完整的問題。
JavaFX的Dialog的問題大概要到Java 9之後才會(huì)比較少。如果想要更容易在JavaFX中使用對(duì)話框的話,可以參考這篇文章:
總結(jié)
以上是生活随笔為你收集整理的java fx dialog_JavaFX 如何使用內建的對話框(Dialog)?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美国电动卡车制造商 Nikola 开始建
- 下一篇: Java中xmp标签的作用_如何在Jav