向 Java 应用程序添加文件选择器
撰稿人:Petr Dvorak(2009 年 12 月),维护人:Alyona Stashkova
本教程介绍了如何使用 javax.swing.JFileChooser 组件向 Java 应用程序中添加文件选择器。可以手动编写所有代码,但使用 NetBeans GUI 构建器是明智的选择,它可以减轻工作量。在此练习中,将创建一个小的 Java 应用程序,用于将 .txt 文件加载到文本区域中。
目录
要学完本教程,您需要具备以下软件和资源。
软件或资源
要求的版本
版本 7.0 或更高版本
版本 6、7 或 8
创建应用程序
首先创建一个新的 Java 应用程序:
从主菜单中,选择 "File"(文件)> "New Project"(新建项目)。选择 "Java" 类别和 "Java Application"(Java 应用程序)项目类型。单击 "Next"(下一步)。
键入 JFileChooserDemo 作为项目名称,并指定项目位置。
取消选中 "Create Main Class"(创建主类)复选框。
单击 "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"(组件面板)。
右键单击 "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"(操作)> "action Performed"(执行的操作)。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"(操作)> "action Performed"(执行的操作)。GUI 构建器自动切换至 "Source"(源)视图,并将构建名为 ExitActionPerformed() 的新事件处理程序方法。ExitActionPerformed 节点显示在 "Navigator"(导航器)窗口中 OpenActionPerformed() 节点的下方。
要使 "Exit" 菜单项正常工作,需要将以下源添加到 ExitActionPerformed() 方法的主体中:
System.exit(0);
切换回 "Design"(设计)模式。从 "Palette"(组件面板)的 "Swing Controls"(Swing 控件)类别中,将文本区域 (JTextArea) 拖入窗体中,如下图所示。
调整已添加组件的大小,以便为文件选择器稍后显示的文本留出空间。将变量重命名为 textarea。此窗体应该类似于下面的屏幕快照:
您已设置了一个简单的 Java 应用程序作为本教程的基础。接下来,将添加实际的文件选择器。
添加文件选择器
选择 "Window"(窗口)> "Navigating"(导航)> "Navigator"(导航器)以打开 "Navigator"(导航器)窗口(如果该窗口尚未打开)。
在 "Navigator"(导航器)中,右键单击 Other Components(其他组件)节点。从上下文菜单中选择 "Add From Palette"(从组件面板上添加)> "Swing Windows"(Swing 窗口)> "File Chooser"(文件选择器)
除了 Add From Palette(从组件面板上添加)上下文菜单之外,还可以从 "Palette"(组件面板)的 "Swing Window"(Swing 窗口)将 JFileChooser 组件拖放至 GUI 构建器的空白区域。结果是一样的,但操作上有一些困难,因为 JFileChooser 的预览非常大,并且可能会不小心将窗口插入到错误的面板。
查看导航器,确认 JFileChooser 已添加到窗体中。
右键单击 JFileChooser 节点,并将变量重命名为 fileChooser。
您已添加了文件选择器。接下来,您要调整文件选择器以显示所需的标题,添加定制文件过滤器,然后将文件选择器集成到应用程序中。
配置文件选择器
实现 "Open" 操作
在 "Navigator"(导航器)窗口中单击选择 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"(修复所有导入)对话框中,接受默认值以更新导入的语句,然后单击 "OK"(确定)。
正如您所看到的,调用 FileChooser 的 getSelectedFile() 方法来确认用户所单击的文件,以便您可以对其进行操作。本示例读取文件内容,并将其显示在文本区域中。
实现文件过滤器
现在,您添加了使文件选择器只显示 *.txt 文件的定制文件过滤器。
切换至 "Design"(设计)模式,然后在 "Navigator"(导航器)窗口中选择 fileChooser。
在 "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"(选项窗格)。
后续步骤