JavaFX的对话框主要分为提示对话框和文件对话框两类,其中提示对话框又分作消息对话框、警告对话框、错误对话框、确认对话框四种。这四种对话框都使用Alert控件表达,并通过对话框类型加以区分,例如AlertType.INFORMATION表示消息对话框,AlertType.WARNIN表示警告对话框,AlertType.ERROR表示错误对话框,AlertType.CONFIRMATION表示确认对话框。另外,Alert工具还提供了下列方法来操作对话框:
setTitle:设置对话框的标题。
setHeaderText:设置对话框的头部文本。
setContentText:设置对话框的内容文本。
show:显示对话框。
showAndWait:显示对话框,并等待按钮返回。该方法的返回类型是Optional<ButtonType>,它用来描述确认对话框选择的是确定按钮还是取消按钮。

接下来分别列举几种提示对话框的实现例子,首先是消息对话框,它的调用代码示例如下:

		Button btn1 = new Button("消息对话框"); // 创建一个按钮
btn1.setOnAction(new EventHandler<ActionEvent>() { // 设置按钮的单击事件
@Override
public void handle(ActionEvent arg0) { // 处理单击事件
Alert alert = new Alert(Alert.AlertType.INFORMATION); // 创建一个消息对话框
alert.setHeaderText("今日天气"); // 设置对话框的头部文本
// 设置对话框的内容文本
alert.setContentText("今天白天晴转多云,北转南风2、3间4级,最高气温28℃;夜间多云转阴,南风2级左右,最低气温16℃。");
alert.show(); // 显示对话框
}
});
flowPane.getChildren().add(btn1); // 往流式窗格上添加按钮

运行包含以上代码的测试程序,单击按钮后弹出的对话框如下图所示,可见消息对话框的提示图标是个内嵌感叹号的圆圈。


其次是警告对话框,它的调用代码示例如下:

		Button btn2 = new Button("警告对话框"); // 创建一个按钮
btn2.setOnAction(new EventHandler<ActionEvent>() { // 设置按钮的单击事件
@Override
public void handle(ActionEvent arg0) { // 处理单击事件
Alert alert = new Alert(Alert.AlertType.WARNING); // 创建一个警告对话框
alert.setHeaderText("编译警告"); // 设置对话框的头部文本
// 设置对话框的内容文本
alert.setContentText("您在本代码的第60行未初始化变量,可能导致空指针异常。");
alert.show(); // 显示对话框
}
});
flowPane.getChildren().add(btn2); // 往流式窗格上添加按钮

运行包含以上代码的测试程序,单击按钮后弹出的对话框如下图所示,可见警告对话框的提示图标是个内嵌感叹号的三角框。


再次是错误对话框,它的调用代码示例如下:

		Button btn3 = new Button("错误对话框"); // 创建一个按钮
btn3.setOnAction(new EventHandler<ActionEvent>() { // 设置按钮的单击事件
@Override
public void handle(ActionEvent arg0) { // 处理单击事件
Alert alert = new Alert(Alert.AlertType.ERROR); // 创建一个错误对话框
alert.setHeaderText("致命错误"); // 设置对话框的头部文本
// 设置对话框的内容文本
alert.setContentText("系统即将关机,请赶紧保存文件。");
alert.show(); // 显示对话框
}
});
flowPane.getChildren().add(btn3); // 往流式窗格上添加按钮

运行包含以上代码的测试程序,单击按钮后弹出的对话框如下图所示,可见错误对话框的提示图标是个内嵌叉号的圆角方框。

最后是确认对话框,它使用showAndWait方法替换了show方法,具体的调用代码示例如下:

		Button btn4 = new Button("确认对话框"); // 创建一个按钮
btn4.setOnAction(new EventHandler<ActionEvent>() { // 设置按钮的单击事件
@Override
public void handle(ActionEvent arg0) { // 处理单击事件
Alert alert = new Alert(Alert.AlertType.CONFIRMATION); // 创建一个确认对话框
alert.setHeaderText("温馨提示"); // 设置对话框的头部文本
// 设置对话框的内容文本
alert.setContentText("尊敬的用户,你真的要卸载我吗?");
// 显示对话框,并等待按钮返回
Optional<ButtonType> buttonType = alert.showAndWait();
// 判断返回的按钮类型是确定还是取消,再据此分别进一步处理
if (buttonType.get().getButtonData().equals(ButtonBar.ButtonData.OK_DONE)) { // 单击了确定按钮OK_DONE
label.setText("您选择了“确定”按钮。虽然依依不舍,但是只能离开了");
} else { // 单击了取消按钮CANCEL_CLOSE
label.setText("您选择了“取消”按钮。让我再陪你三百六十五个日夜");
}
}
});
flowPane.getChildren().add(btn4); // 往流式窗格上添加按钮

运行包含以上代码的测试程序,单击按钮后弹出的对话框如下图所示,可见确认对话框的提示图标是个内嵌问号的圆圈。


各自单击确认对话框上的确定按钮和取消按钮,对话框消失后的窗口界面分别如下面两张图所示。


除了提示对话框这一大类,还有文件对话框FileChooser,它又细分为文件打开对话框与文件保存对话框两种,FileChooser的常见方法说明如下:
setTitle:设置文件对话框的标题。
setInitialDirectory:设置文件对话框的初始目录。
getExtensionFilters:获得文件对话框的扩展过滤器。调用过滤器的add方法或者addAll方法可以添加新的文件类型过滤器。
showOpenDialog:显示文件打开对话框。该方法返回一个选中的文件对象。
showOpenMultipleDialog:显示文件打开对话框,且该对话框支持同时选择多个文件。该方法返回一个选中的文件清单。
showSaveDialog:显示文件保存对话框。该方法返回一个待保存的文件对象,文件可能存在也可能不存在。

接着看个文件对话框的运用场景,现在准备打开某张图片,以便对该图片进行加工。鉴于图片文件包含jpg、gif、bmp、png等多种格式,在创建文件类型过滤器时得添加主要的几种图片扩展名,下面便是打开图片的对话框调用代码例子:

		Button btn1 = new Button("文件打开对话框"); // 创建一个按钮
btn1.setOnAction(new EventHandler<ActionEvent>() { // 设置按钮的单击事件
@Override
public void handle(ActionEvent arg0) { // 处理单击事件
FileChooser chooser = new FileChooser(); // 创建一个文件对话框
chooser.setTitle("打开文件"); // 设置文件对话框的标题
chooser.setInitialDirectory(new File("E:\\")); // 设置文件对话框的初始目录
// 给文件对话框添加多个文件类型的过滤器
chooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("所有文件", "*.*"),
new FileChooser.ExtensionFilter("所有图片", "*.jpg", "*.gif", "*.bmp", "*.png"));
// 显示文件打开对话框,且该对话框支持同时选择多个文件
File file = chooser.showOpenDialog(stage); // 显示文件打开对话框
if (file == null) { // 文件对象为空,表示没有选择任何文件
label.setText("未选择任何文件");
} else { // 文件对象非空,表示选择了某个文件
label.setText("准备打开的文件路径是:"+file.getAbsolutePath());
}
}
});
flowPane.getChildren().add(btn1); // 往流式窗格上添加按钮

运行包含以上代码的测试程序,单击按钮后弹出的对话框如下图所示。


在文件对话框中选择某个目录下的某个图片文件,此时对话框界面如下图所示。


然后单击确定按钮,回到主程序的窗口界面如下图所示,可见主程序成功获取到了该文件的完整路径。

再来验证文件保存对话框的使用过程,这次期望将一段文字保存到文本文件,那么具体实现的对话框代码如下所示:

		Button btn2 = new Button("文件保存对话框"); // 创建一个按钮
btn2.setOnAction(new EventHandler<ActionEvent>() { // 设置按钮的单击事件
@Override
public void handle(ActionEvent arg0) { // 处理单击事件
FileChooser chooser = new FileChooser(); // 创建一个文件对话框
chooser.setTitle("保存文件"); // 设置文件对话框的标题
chooser.setInitialDirectory(new File("E:\\")); // 设置文件对话框的初始目录
// 创建一个文件类型过滤器
FileChooser.ExtensionFilter filter = new FileChooser.ExtensionFilter("文本文件(*.txt)", "*.txt");
// 给文件对话框添加文件类型过滤器
chooser.getExtensionFilters().add(filter);
File file = chooser.showSaveDialog(stage); // 显示文件保存对话框
if (file == null) { // 文件对象为空,表示没有选择任何文件
label.setText("未选择任何文件");
} else { // 文件对象非空,表示选择了某个文件
label.setText("准备保存的文件路径是:"+file.getAbsolutePath());
}
}
});
flowPane.getChildren().add(btn2); // 往流式窗格上添加按钮

运行包含以上代码的测试程序,单击按钮后弹出的对话框如下图所示。


在文件对话框中进入到指定目录,并在对话框下方的文件名一栏填写待保存的文件名称,此时对话框界面如下图所示。


然后单击确定按钮,回到主程序的窗口界面如下图所示,可见主程序也获取到了该文件的完整路径。


更多Java技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(一百四十二)JavaFX的对话框的更多相关文章

  1. Java开发笔记(三十二)字符型与整型相互转化

    前面提到字符类型是一种新的变量类型,然而编码实践的过程中却发现,某个具体的字符值居然可以赋值给整型变量!就像下面的例子代码那样,把字符值赋给整型变量,编译器不但没报错,而且还能正常运行! // 字符允 ...

  2. Java开发笔记(八十二)注解的基本单元——元注解

    Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义.前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的: @ ...

  3. Java开发笔记(四十二)日历工具的常见应用

    前面介绍了日历工具Calendar的基本用法,乍看起来Calendar与Date两个半斤八两,似乎没有多大区别,那又何苦庸人自扰鼓捣一个新玩意呢?显然这样小瞧了Calendar,其实它的作用大着呢,接 ...

  4. Java开发笔记(五十二)对象的类型检查

    前面介绍了类的多态性,来自于鸡类的实例chicken,既能用来表达公鸡实例,也能用来表达母鸡实例.可是这导致了一个问题,假如在call方法内部需要手工判断输入参数属于公鸡实例还是母鸡实例,那该如何是好 ...

  5. Java开发笔记(六十二)如何定义函数式接口

    前面介绍了Lambda表达式的用法,从实践中发现它确实极大地方便了开发者,然而不管是匿名内部类还是Lambda表达式,所举的例子都离不开各类数组的排序方法,倘使Lambda表达式仅能用于sort方法, ...

  6. Java开发笔记(七十二)Java8新增的流式处理

    通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...

  7. Java开发笔记(三十八)利用正则表达式校验字符串

    前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...

  8. Java开发笔记(三十九)日期工具Date

    Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...

  9. Java开发笔记(四十)日期与字符串的互相转换

    前面介绍了如何通过Date工具获取各个时间数值,但是用户更喜欢形如“2018-11-24 23:04:18”这种结构清晰.简洁明了的字符串,而非啰里八唆依次汇报每个时间单位及其数值的描述.既然日期时间 ...

  10. Java开发笔记(八十四)文件与目录的管理

    程序除了处理内存中的数据结构,还要操作磁盘上的各类文件,这里的磁盘是个统称,泛指可以持久保留数据的存储介质,包括但不限于:插在软驱中的软盘.固定在机箱中的硬盘.插在光驱中的光盘.插在USB接口上的U盘 ...

随机推荐

  1. diffy 方便的bug 以及流量测试系统

    diffy 是twiiter 开源的流量以及bug 查找系统 参考使用图 几点说明 使用diffy我们需要三个角色 candidate instance 候选实例,运行新的代码 primary ins ...

  2. 封装好的observer.js,用于非父子组件传值,直接调用$on和$emit方法

    const eventList = {} const $on = (eventName,callback)=>{ if(!eventList[eventName]){ eventList[eve ...

  3. cogs 999. [東方S2]雾雨魔理沙

    二次联通门 : cogs 999. [東方S2]雾雨魔理沙 摸你傻赛高!! /* cogs 999. [東方S2]雾雨魔理沙 原来以为是一道计算几何的题 可是细细一想发现.. 这就是一道dp 由于给定 ...

  4. 【JZOJ6246】【20190627】B

    题目 求逆续对个数为\(k\)的\(n\)阶排列个数\(mod \ 1e9+7\) $1 \le n  ,  k \le 10^5 $ 题解 $f_{i,j} = \sum_{k=0}^{i-1} f ...

  5. oracle 使用length()函数需要注意的坑!

      1.情景展示 筛选出指定字段字符长度既不等于18也不等于15的数据. 2.原因分析 第一步:按字符串度进行分组统计: 第二步:筛选数据. 你会发现,只将length=17统计了出来,长度不存在的数 ...

  6. 【Beta】发布说明

    再次号外!Visual Pytorch第二个版本上线了! 目前的网址在这里(http://114.115.151.39/) 哦 有关上一版本的功能介绍说明请参考博客:Visual Pytorch -- ...

  7. Delphi XE7并行编程: 并行For循环

    从Delphi XE7开始,引入了全新的并行编程库用于简化并行编程,它位于System.Threading单元中. 下面是一个判断素数的简单例子:function IsPrime (N: Intege ...

  8. .Net Core3 新特性整理

    .net core 3实现了.net 标准2.1. 1.生成可执行文件 以前版本需要dotnet run运行项目,.net core 3支持直接生成目标平台的可执行文件.比如windows就是exe了 ...

  9. hg19基因组 | 功能区域 | 位置提取

    如何获取hg19的CDS.UTR.intergenic.intron等的位置信息? 参考手册: Hg19 regions for Intergenic, Promoters, Enhancer, Ex ...

  10. linux中nohup 与 & 的区别

    Linux/Unix下,通常只有守护进程可在脱离终端的情况下能继续执行,而普通进程在关闭终端时会因收到SIGHUP信号(挂起信号)而退出.当终端退出后,由该终端启动的后台程序自动退出. 若想命令在后台 ...