JavaFX 如何使用内置的对话框

消息对话框(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来大幅调整内置对话框的样式。若要取得DialogDialogPane,可使用getDialogPane()方法,会直接回传DialogPane对象。要修改DialogPane的内容,可以使用setContent这个方法,传入自己制作的Node。

alert.getDialogPane().setContent(content);

可制作出如下,能显示Exception消息的Error Dialog:

另外也可以使用setExpandableContent方法,同样传入自制的Node来创建可扩展与收合内容消息的对话框。

alert.getDialogPane().setExpandableContent(expContent);

 

posted @ 2024-08-03 22:36  psy5choit  阅读(67)  评论(0)    收藏  举报