除了常规的提示对话框,还有一种对话框也很常见,它叫做文件对话框。文件对话框又分为两小类:打开文件的对话框、保存文件的对话框,但在Swing中它们都用类型JFileChooser来表达。下面是JFileChooser的常用方法说明:
setDialogTitle:设置文件对话框的标题。
setApproveButtonText:设置确定按钮的文本。
setCurrentDirectory:设置文件对话框的初始目录。
setMultiSelectionEnabled:设置是否支持选择多个文件。取值true表示支持多选,false表示不支持多选,默认不允许多选。
setFileSelectionMode:设置文件的选择模式。选择模式有三种:JFileChooser.FILES_ONLY(只显示文件,不过实际测试发现也会显示目录),JFileChooser.DIRECTORIES_ONLY(只显示目录),JFileChooser.FILES_AND_DIRECTORIES(显示文件与目录)。
setFileFilter:设置文件挑选的过滤器。
setDialogType:设置对话框的类型。取值JFileChooser.OPEN_DIALOG代表这是文件打开对话框,JFileChooser.SAVE_DIALOGG代表这是文件保存对话框。
showOpenDialog:显示文件打开对话框。该方法的返回值体现了文件选择与否,为JFileChooser.APPROVE_OPTION时表示在对话框上按下了确定按钮,为JFileChooser.CANCEL_OPTION时表示在对话框上按下了取消按钮。
showSaveDialog:显示文件保存对话框。该方法的返回值说明同showOpenDialog。
getSelectedFile:获取当前选中的文件对象。
getSelectedFiles:仅在多选情况下,获取当前选中的文件对象数组。
上述方法当中,尤为需要注意的是setFileFilter,乍看起来该方法的输入参数为FileFilter类型,但它并非java.io下面的文件过滤器,而是Swing自带的文件对话框过滤器。这个过滤器与IO库的同名过滤器相比,一样拥有accept方法判断当前文件是否满足过滤条件;不同之处在于,文件对话框的过滤器多了个getDescription方法,该方法的返回字符串要显示在对话框内部的文件类型下拉列表中,相当于给文件类型做个补充说明。例如,txt类型俗称文本文件,jpg、gif、png几个类型合称图片文件,ppt、pptx类型称作幻灯片文件等等。具体的文件过滤器调用代码示例如下:

  1. JFileChooser chooser = new JFileChooser(); // 创建一个文件对话框
  2. chooser.setCurrentDirectory(new File("E:/")); // 设置文件对话框的当前目录
  3. chooser.setFileFilter(new FileFilter() { // 设置文件对话框的文件过滤器
  4. @Override
  5. public boolean accept(File file) { // 判断当前文件是否满足过滤条件,只有满足条件的才会显示在对话框中
  6. // 目录满足条件,扩展名为txt的文件也满足条件
  7. return file.isDirectory() || file.getName().toLowerCase().endsWith(".txt");
  8. }
  9.  
  10. @Override
  11. public String getDescription() { // 获取过滤器的描述
  12. return "*.txt(文本文件)";
  13. }
  14. });

接下来演示看看如何操作文件对话框,先给一个按钮注册单击监听器,在单击按钮时调用showOpenDialog方法弹出文件对话框。以文件打开对话框为例,具体的调用代码如下所示:

  1. btnOpenFile.addActionListener(new ActionListener() { // 给按钮注册一个点击监听器
  2. @Override
  3. public void actionPerformed(ActionEvent e) { // 发生了单击事件
  4. // 设置文件对话框的类型,这里的对话框准备打开文件
  5. chooser.setDialogType(JFileChooser.OPEN_DIALOG);
  6. // 显示文件打开的对话框
  7. int result = chooser.showOpenDialog(frame);
  8. if (result == JFileChooser.APPROVE_OPTION) { // 单击了确定按钮
  9. // 获取在文件对话框中选择的文件
  10. File file = chooser.getSelectedFile();
  11. label.setText("<html>准备打开的文件路径为:" + file.getAbsolutePath() + "</html>");
  12. } else { // 未单击确定按钮
  13. label.setText("取消打开文件");
  14. }
  15. }
  16. });

运行测试程序,单击按钮弹出的文件打开对话框如下图所示。


双击进入文件对话框里面的下级目录,找到某个文本文件并单击它,文件对话框的“文件名”一栏显示该文件的名称,表示已经选中这个文件,此时对话框界面如下图所示。

然后单击对话框下方的“打开”按钮,回到如下图所示的程序主界面,可见主界面成功获知刚才选中文件的完整路径。

同样给另一个按钮注册单击监听器,在单击按钮时调用showSaveDialog方法弹出文件保存对话框,此时的调用代码如下所示:

  1. btnSaveFile.addActionListener(new ActionListener() { // 给按钮注册一个点击监听器
  2. @Override
  3. public void actionPerformed(ActionEvent e) { // 发生了单击事件
  4. // 设置文件对话框的类型,这里的对话框准备保存文件
  5. chooser.setDialogType(JFileChooser.SAVE_DIALOG);
  6. // 显示文件保存的对话框
  7. int result = chooser.showSaveDialog(frame);
  8. if (result == JFileChooser.APPROVE_OPTION) { // 单击了确定按钮
  9. // 获取在文件对话框中选择的文件
  10. File file = chooser.getSelectedFile();
  11. label.setText("<html>准备保存的文件路径为:" + file.getAbsolutePath() + "</html>");
  12. } else { // 未单击确定按钮
  13. label.setText("取消保存文件");
  14. }
  15. }
  16. });

运行测试程序,单击按钮弹出的文件保存对话框如下图所示。


与文件打开对话框相比,文件保存对话框的左上角标题由“打开”改为“保存”,下方的“打开”按钮改为“保存”按钮,除了这两个地方有变化,其它都一模一样。在对话框的“文件名”一栏填写待保存的文件名,然后单击“保存”按钮,回到如下图所示的程序主界面,可见主界面成功获知那个待保存文件的完整路径。


文件对话框的内部字体也不能通过setFont方法直接修改,原因很简单,对话框只是一个框架,框架内部又有许多控件,故而需要遍历这些内部控件,再一一设置每个控件的文本字体。详细的对话框字体设置方法定义如下:

  1. // 设置对话框的内部字体。第一个参数需要传入文件对话框的实例
  2. private static void setComponentFont(Component component, Font font) {
  3. component.setFont(font); // 设置当前组件的字体
  4. if (component instanceof Container) { // 如果该组件是容器
  5. Container container = (Container) component; // 把该组件强制转为容器
  6. int count = container.getComponentCount(); // 获取容器内部的组件数量
  7. for (int i = 0; i < count; i++) { // 遍历该容器的所有组件
  8. // 给每个组件再设置一遍内部字体
  9. setComponentFont(container.getComponent(i), font);
  10. }
  11. }
  12. }


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

Java开发笔记(一百三十五)Swing的文件对话框的更多相关文章

  1. Java开发笔记(三十五)字符串格式化

    前面介绍了字符串变量的四种赋值方式,对于简单的赋值来说完全够用了,即便是两个字符串拼接,也只需通过加号把两个目标串连起来即可.但对于复杂的赋值来说就麻烦了,假设现在需要拼接一个很长的字符串,字符串内部 ...

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

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

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

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

  4. Java开发笔记(六十五)集合:HashSet和TreeSet

    对于相同类型的一组数据,虽然Java已经提供了数组加以表达,但是数组的结构实在太简单了,第一它无法直接添加新元素,第二它只能按照线性排列,故而数组用于基本的操作倒还凑合,若要用于复杂的处理就无法胜任了 ...

  5. Java开发笔记(二十五)方法的输入参数

    前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述.一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定 ...

  6. Java开发笔记(三十)大小数BigDecimal

    前面介绍的BigInteger只能表达任意整数,但不能表达小数,要想表达任意小数,还需专门的大小数类型BigDecimal.如果说设计BigInteger的目的是替代int和long类型,那么设计Bi ...

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

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

  8. Java开发笔记(三十四)字符串的赋值及类型转换

    不管是基本的char字符型,还是包装字符类型Character,它们的每个变量只能存放一个字符,无法满足对一串字符的加工.为了能够直接操作一连串的字符,Java设计了专门的字符串类型String,该类 ...

  9. Java开发笔记(三十六)字符串的常用方法

    不管是给字符串赋值,还是对字符串格式化,都属于往字符串填充内容,一旦内容填充完毕,则需开展进一步的处理.譬如一段Word文本,常见的加工操作就有查找.替换.追加.截取等等,按照字符串的处理结果异同,可 ...

  10. Java开发笔记(四十五)成员属性与成员方法

    前面介绍了许多数据类型,除了基本类型如整型int.双精度型double.布尔型boolean之外,还有高级一些的如包装整型Integer.字符串类型String.本地日期类型LocalDate等等,那 ...

随机推荐

  1. Tips on Blind Source Separation

    盲源分离是指在不知道源信号和信道传输参数的情况下,根据输入信号的统计特性,仅由观测信号恢复出源信号各个独立成分的过程.盲源分离研究的信号模型主要有三种:线性混合模型.卷积混合模型和非线性混合模型. 1 ...

  2. BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie

    开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...

  3. WinDbg常用命令系列---.write_cmd_hist (写命令历史记录)

    .write_cmd_hist 简介 .write_cmd_hist命令将调试器命令窗口的整个历史记录写入文件. 使用形式 .write_cmd_hist Filename 参数 Filename指定 ...

  4. 关于集成通用mapper的Mybatis代码生成器产生的model类注解

    主要是@Table.@Id.@GeneratedValue.@Column 4个注解 这四个注解都来自javax.persistence包,是Java持久层规范,单纯的Mybatis并不认识这四个注解 ...

  5. Pytest权威教程(官方教程翻译)

    Pytest权威教程01-安装及入门 Pytest权威教程02-Pytest 使用及调用方法 Pytest权威教程03-原有TestSuite的执行方法 Pytest权威教程04-断言的编写和报告 P ...

  6. CSS系列之后代选择器、子选择器和相邻兄弟选择器

    后代选择器比子选择器的范围大,包含子选择器,且包含子选择器的“子孙”选择器,后代选择器使用"空格"符号间隔选择器 子选择器:子选择器只是父选择器的一级子元素,使用"> ...

  7. spark集成kerberos

    1.生成票据 1.1.创建认证用户 登陆到kdc服务器,使用root或者可以使用root权限的普通用户操作: # kadmin.local -q “addprinc -randkey spark/yj ...

  8. iwms后台编辑器无法粘贴word格式的解决方法

    iwms后台编辑器用的是tiny_mce,默认会自动过滤word粘贴中的格式,以减小数据库的占用,但在word中辛苦做的字体和格式都不见了,可采用下方法关闭编辑器的自动清除格式功能. 编辑文件:\ti ...

  9. Java 12 骚操作, switch居然还能这样玩!

    Java 13 都快要来了,12必须跟栈长学起! Java 13 即将发布,新特性必须抢先看! Java 12 中对 switch 的语法更友好了,建议大家看下栈长在Java技术栈微信公众号分享的&l ...

  10. js - 总结一下条件语句优化

    [笔记] // 简单的语句用三目运算符也可以的(除了需要return的) 1 == 1 ? console.log('执行了...1') : console.log(); 1 == 2 ? conso ...