向 Java 应用程序添加文件选择器
撰稿人:Petr Dvorak(2009 年 12 月),维护人:Alyona Stashkova
本教程介绍了如何使用 javax.swing.JFileChooser 组件向 Java 应用程序中添加文件选择器。可以手动编写所有代码,但使用 NetBeans GUI 生成器是明智的选择,它可以减轻工作量。在此练习中,将创建一个小的 Java 应用程序,用于将 .txt 文件装入到文本区域中。
可以下载带有文件选择器的生成项目。
目录
要学完本教程,您需要具备以下软件和资源。
创建应用程序
首先创建一个新的 Java 应用程序:
- 从主菜单中,选择 "File"(文件)> "New Project"(新建项目)。选择 "Java" 类别和 "Java Application"(Java 应用程序)项目类型。单击 "Next"(下一步)。
- 键入
JFileChooserDemo 作为项目名称,并指定项目位置。
- 取消选中 "Create Main Class"(创建主类)复选框。
- 确保 "Set As Main Project"(设置为主项目)复选框处于选中状态。
- 单击 "Finish"(完成)。
创建应用程序窗体
在本部分中,将创建 JFrame 容器,并向其中添加几个组件。
要创建 JFrame 窗体,请执行以下操作:
- 右键单击 "Source Packages"(源包)节点,然后选择 "New"(新建)> "Other"(其他)。选择 "Swing GUI Forms"(Swing GUI 窗体)类别和 "JFrameForm" 文件类型。单击 "Next"(下一步)。
- 键入
JFileChooserDemo 作为类名。
- 键入
jfilechooserdemo.resources 作为包。
- 单击 "Finish"(完成)。
- 在 "Properties"(属性)窗口中,输入
Demo application 作为 "Title"(标题)属性,然后按 Enter 键进行确认。
将组件添加到 JFrame 窗体中:
- 在 "Palette"(组件面板)中,打开 "Swing Menus"(Swing 菜单)类别,选择 "Menu Bar"(菜单栏)组件,然后将其拖至 JFrame 的左上角。
注意:如果未显示 "Palette"(组件面板),请在主菜单中选择 "Window"(窗口)> "Palette"(组件面板),或按 Ctrl+Shift+8 组合键将其打开。
- 右键单击 "Menu Bar"(菜单栏)组件的 "Edit"(编辑)项,然后在上下文菜单中选择 "Delete"(删除)。
- 要添加菜单项,以便从正在运行的应用程序打开文件选择器,请在 "Palette"(组件面板)的 "Swing Menus"(Swing 菜单)类别中,选择新的菜单项 (JMenuItem1),然后将其拖放至 "Menu Bar"(菜单栏)的 "File"(文件)项。
注意:请确保先选择 "Menu Bar"(菜单栏),然后再将其他菜单项拖至此处,以便将后者添加到 "Menu Bar"(菜单栏)中。
- 在 "Design"(设计)视图中右键单击 jMenuItem1,然后从上下文菜单中选择 "Change Variable Name"(更改变量名称)。将项重命名为
Open,然后单击 "OK"(确定)。
- 确保 jMenuItem1 在 "Design"(设计)视图中仍处于选中状态。按空格键编缉组件的文本。将文本更改为
Open,然后按 Enter 键进行确认。
- 为 "Open" 菜单项指定操作处理程序。右键单击菜单项,然后从上下文菜单中选择 "Events"(事件)> "Action" > "actionPerformed"。GUI 生成器自动切换至 "Source"(源)视图,并生成名为 OpenActionPerformed() 的新事件处理程序方法。"Navigator"(导航)窗口应如下所示:
- 要添加菜单项,以便从正在创建的应用程序中退出文件选择器,并切换回 "Design"(设计)模式,请在 "Palette"(组件面板)的 "Swing Menus"(Swing 菜单)类别中,选择菜单项 (JMenuItem1),然后将其拖至 "Menu Bar"(菜单栏)中 "Open" 菜单项的下方。请注意橙色的突出显示,表示要放置 JMenuItem1 的位置。

- 在 "Design"(设计)视图中右键单击 jMenuItem1,然后从上下文菜单中选择 "Change Variable Name"(更改变量名称)。将项重命名为
Exit,然后单击 "OK"(确定)。
- 确保 jMenuItem1 在 "Design"(设计)视图中仍处于选中状态。按空格键编缉组件的文本。将文本更改为 Exit,然后按 Enter 键进行确认。
- 为 "Exit" 菜单项指定操作处理程序。右键单击菜单项,然后从上下文菜单中选择 "Events"(事件)> "Action" > "actionPerformed"。GUI 生成器自动切换至 "Source"(源)视图,并将生成名为
ExitActionPerformed() 的新事件处理程序方法。ExitActionPerformed 节点显示在 "Navigator"(导航)窗口中 OpenActionPerformed() 节点的下方。
- 要使 "Exit" 菜单项正常工作,需要将以下源添加到
ExitActionPerformed() 方法的主体中:
System.exit(0);
- 切换回 "Design"(设计)模式。从 "Palette"(组件面板)的 "Swing Controls"(Swing 控件)类别中,将文本区域 (JTextArea) 拖入窗体中,如下图所示。
- 调整已添加组件的大小,以便为文件选择器稍后显示的文本留出空间。将变量重命名为
textarea。此窗体应该类似于下面的屏幕快照:
您已设置了一个简单的 Java 应用程序作为本教程的基础。接下来,将添加实际的文件选择器。
添加文件选择器
- 选择 "Window"(窗口)> "Navigating"(导航)> "Inspector"(检查器)以打开 "Inspector"(检查器)窗口(如果该窗口尚未打开)。
- 在 "Inspector"(检查器)中,右键单击 "JFrame" 节点。从上下文菜单中选择 "Add From Palette"(从组件面板上添加)> "Swing Windows"(Swing 窗口)> "File Chooser"(文件选择器)。
GUI 生成器提示:除了 "Add From Palette"(从组件面板上添加)上下文菜单之外,还可以从 "Palette"(组件面板)的 "Swing Window"(Swing 窗口)将 JFileChooser 组件拖放至 GUI 生成器的空白区域。结果是一样的,但操作上有一些困难,因为 JFileChooser 的预览非常大,并且可能会不小心将窗口插入到错误的面板。
- 查看检查器,确认 JFileChooser 已添加到窗体中。
- 右键单击 "JFileChooser" 节点,并将变量重命名为
fileChooser。
您已添加了文件选择器。接下来,您要调整文件选择器以显示所需的标题,添加定制文件过滤器,然后将文件选择器集成到应用程序中。
配置文件选择器
实现 "Open" 操作
- 在 "Inspector"(检查器)窗口中单击选择 "JFileChooser",然后在 "Properties"(属性)对话框中编辑其属性。将 "dialogTitle" 属性更改为
This is my open dialog,按 Enter 键,然后关闭 "Properties"(属性)对话框。
-
单击 GUI 生成器中的 "Source"(源)按钮,以切换至 "Source"(源)模式。要将文件选择器集成到应用程序中,请将以下代码片段粘贴到现有的
OpenActionPerformed() 方法中。
private void OpenActionPerformed(java.awt.event.ActionEvent evt) {
int returnVal = fileChooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
try {
// What to do with the file, e.g. display it in a TextArea
textarea.read( new FileReader( file.getAbsolutePath() ), null );
} catch (IOException ex) {
System.out.println("problem accessing file"+file.getAbsolutePath());
}
} else {
System.out.println("File access cancelled by user.");
}
}
注意:删除代码片段中与源文件中现有的第一行和最后一行重复的行。
- 如果编辑器报告代码中存在错误,请在该代码中右键单击任意位置,然后选择 "Fix Imports"(修复导入)或按 Ctrl+Shift+I 组合键。在 "Fix All Imports"(修复所有导入)对话框中,接受缺省值以更新 import 语句,然后单击 "OK"(确定)。
正如您所看到的,调用 FileChooser 的 getSelectedFile() 方法来确认用户所单击的文件,以便您可以对其进行操作。本示例读取文件内容,并将其显示在文本区域中。
实现文件过滤器
现在,您添加了使文件选择器只显示 *.txt 文件的定制文件过滤器。
- 切换至 "Design"(设计)模式,然后在 "Inspector"(检查器)窗口中选择文件选择器。
- 在 "Properties"(属性)窗口中,单击 "fileFilter" 属性旁边的省略号 ("...") 按钮。
- 在 "File Filter"(文件过滤器)对话框的组合框中,选择 "Custom Code"(定制代码)。

-
在文本字段中键入 new MyCustomFilter()。单击 "OK"(确定)。
-
要使定制代码正常工作,需要编写内部(或外部)MyCustomFilter 类,以扩展 FileFilter 类。复制以下代码片段,并将其粘贴到类的源代码中 import 语句的下方,以创建实现过滤器的内部类。
class MyCustomFilter extends javax.swing.filechooser.FileFilter {
@Override
public boolean accept(File file) {
// Allow only directories, or files with ".txt" extension
return file.isDirectory() || file.getAbsolutePath().endsWith(".txt");
}
@Override
public String getDescription() {
// This description will be displayed in the dialog,
// hard-coded = ugly, should be done via I18N
return "Text documents (*.txt)";
}
}
注意:要了解如何实现更加智能化的可切换文件过滤器,请查看 addChoosableFileFilter 方法。
运行应用程序
- 右键单击 "JFileChooserDemo" 项目,然后选择 "Run"(运行),以启动样例项目。
-
在 "Run Project"(运行项目)对话框中,选择
jfilechooserdemo.resources.JFileChooserDemo 主类,然后单击 "OK"(确定)。
- 在正运行的 Demo 应用程序中,从 "File"(文件)菜单中选择 "Open"(打开),以触发相应操作。
该结果应该与此类似:

- 要关闭该应用程序,请在 "File"(文件)菜单中选择 "Exit"(退出)。
查看 GUI 组件面板中的其他有用 Swing 窗口和对话框,如 "ColorChooser"(颜色选择器)或 "OptionPane"(选项窗格)。
后续步骤