• Java开发笔记(一百三十五)Swing的文件对话框


    除了常规的提示对话框,还有一种对话框也很常见,它叫做文件对话框。文件对话框又分为两小类:打开文件的对话框、保存文件的对话框,但在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类型称作幻灯片文件等等。具体的文件过滤器调用代码示例如下:

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

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

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

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


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

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



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

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

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


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


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

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



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

  • 相关阅读:
    ubuntu server 14.04和18.04挂载vmware共享文件夹
    Ubuntu 无法进行SSH连接,开启22端口
    ubuntu切换到root用户
    VMware Workstation 15 Pro 永久激活密钥
    idea静态资源的访问问题,如HTML,css,js的加载
    idea在Tomcat服务器加载html文件出现乱码的解决方案
    html,js 打开时出现 Uncaught TypeError: Cannot read property 'addEventListener' of null at register.js:24错误的解决方法
    js判断input输入是不是含有中文,或者判断输入是不是全是中文
    PHP连接前端from数据的错误,如源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。
    PHP与Tomcat运行前的配置。
  • 原文地址:https://www.cnblogs.com/pinlantu/p/11330913.html
Copyright © 2020-2023  润新知