blob: bdb1ec51d84d737d01119f2a44d0965bbbfbf4a8 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>向 Java 应用程序添加文件选择器</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="../../../netbeans.css" media="screen" />
<meta name="author" content="Petr Dvorak, Alyona Stashkova" />
<meta name="description" content="How to add a file chooser to a Java application using the javax.swing.JFileChooser component and the NetBeans GUI Builder." />
<meta name="keywords" content="javax.swing.JFileChooser, java, application, file, chooser, GUI builder" />
</head>
<body>
<h1>向 Java 应用程序添加文件选择器</h1>
<p><em>撰稿人:Petr Dvorak<a href="http://blogs.oracle.com/joshis/entry/a_quick_jfilechooser_demo">(2009 年 12 月)</a>,维护人:Alyona Stashkova</em></p>
<p>
本教程介绍了如何使用 <tt>javax.swing.JFileChooser</tt> 组件向 Java 应用程序中添加文件选择器。可以手动编写所有代码,但使用 NetBeans GUI 构建器是明智的选择,它可以减轻工作量。在此练习中,将创建一个小的 Java 应用程序,用于将 <tt>.txt</tt> 文件加载到文本区域中。 </p>
<p>可以<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%252FJFileChooserDemo.zip" title="包含演示项目 (JFileChooserDemo) 的 ZIP 文件">使用文件选择器下载生成的项目</a><br />
</p>
<p><b>目录</b></p>
<img alt="此页上的内容适用于 NetBeans IDE 7.0 及更高版本" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="此页上的内容适用于 NetBeans IDE 7.0 及更高版本" />
<ul>
<li><a href="#app" title="创建应用程序">创建应用程序</a></li>
<li><a href="#menu" title="创建应用程序窗体">创建应用程序窗体</a></li>
<li><a href="#filechooser" title="添加文件选择器">添加文件选择器</a></li>
<li><a href="#config" title="配置文件选择器">配置文件选择器</a></li>
<li><a href="#run" title="运行应用程序">运行应用程序</a></li>
</ul>
<p><b>要学完本教程,您需要具备以下软件和资源。</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">软件或资源</th>
<th class="tblheader" scope="col">要求的版本</th>
</tr>
<tr>
<td class="tbltd1"><a href="http://netbeans.org/downloads/">NetBeans IDE</a></td>
<td class="tbltd1">版本 7.0 或更高版本 </td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 开发工具包</a> (JDK)</td>
<td class="tbltd1">版本 6、7 或 8 </td>
</tr>
</tbody>
</table>
<h2><a name="app"></a>创建应用程序</h2>
<p>首先创建一个新的 Java 应用程序:</p>
<ol>
<li>从主菜单中,选择 "File"(文件)> "New Project"(新建项目)。选择 "Java" 类别和 "Java Application"(Java 应用程序)项目类型。单击 "Next"(下一步)。</li>
<li>键入 <code>JFileChooserDemo</code> 作为项目名称,并指定项目位置。</li>
<li>取消选中 "Create Main Class"(创建主类)复选框。
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-filechooser/newproj.png" rel="lytebox" title="新建项目向导"> <img alt="新建项目向导" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/newproj-small.png"></a></p></li>
<li>单击 "Finish"(完成)。</li>
</ol>
<h2><a name="menu"></a>创建应用程序窗体</h2>
<p>在本部分中,将创建 <tt>JFrame</tt> 容器,并向其中添加几个组件。</p>
<p><b>要创建 JFrame 窗体,请执行以下操作:</b></p>
<ol>
<li>右键单击 "Source Packages"(源包)节点,然后选择 "New"(新建)> "Other"(其他)。选择 "Swing GUI Forms"(Swing GUI 窗体)类别和 "JFrameForm" 文件类型。单击 "Next"(下一步)。</li>
<li>键入 <code>JFileChooserDemo</code> 作为类名。</li>
<li>键入 <code>jfilechooserdemo.resources</code> 作为包。
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-filechooser/newjframeform.png" rel="lytebox" title="正在创建的新 JFrame 容器"> <img alt="正在创建的新 JFrame 容器" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/newjframeform-small.png"></a></p></li>
<li>单击 "Finish"(完成)。</li>
<li>在 "Properties"(属性)窗口中,输入 <code>Demo application</code> 作为 "Title"(标题)属性,然后按 Enter 键进行确认。</li>
</ol>
<p><b>将组件添加到 JFrame 窗体中:</b></p>
<ol>
<li>在 "Palette"(组件面板)中,打开 "Swing Menus"(Swing 菜单)类别,选择 "Menu Bar"(菜单栏)组件,然后将其拖至 JFrame 的左上角。
<p class="notes"><b>注:</b>如果未显示 "Palette"(组件面板),请从主菜单中选择 "Window"(窗口)> "Palette"(组件面板)。 </p>
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-filechooser/menubaradded.png" rel="lytebox" title="添加到 JFrame 窗体中的菜单栏"> <img alt="添加到 JFrame 窗体中的菜单栏" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/menubaradded-small.png"></a></p></li>
<li>右键单击 "Menu Bar"(菜单栏)组件的 "Edit"(编辑)项,然后在上下文菜单中选择 "Delete"(删除)。 </li>
<li>要添加菜单项,以便从正在运行的应用程序打开文件选择器,请在 "Palette"(组件面板)的 "Swing Menus"(Swing 菜单)类别中,选择新的菜单项 (JMenuItem1),然后将其拖放至 "Menu Bar"(菜单栏)的 "File"(文件)项。
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-filechooser/menuitemadded.png" rel="lytebox" title="添加到菜单栏中的菜单项"> <img alt="添加到菜单栏中的菜单项" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/menuitemadded-small.png"></a></p>
<p class="notes"><b>注:</b>请确保先选择 "Menu Bar"(菜单栏),然后再将其他菜单项拖至此处,以便将后者添加到 "Menu Bar"(菜单栏)中。 </p></li>
<li>在 "Design"(设计)视图中右键单击 jMenuItem1,然后从上下文菜单中选择 "Change Variable Name"(更改变量名称)。将项重命名为 <code>Open</code>,然后单击 "OK"(确定)。</li>
<li>确保 jMenuItem1 在 "Design"(设计)视图中仍处于选中状态。按空格键编缉组件的文本。将文本更改为 <code>Open</code>,然后按 Enter 键进行确认。</li>
<li>为 "Open" 菜单项指定操作处理程序。右键单击菜单项,然后从上下文菜单中选择 "Events"(事件)> "Action"(操作)> "action Performed"(执行的操作)。GUI 构建器自动切换至 "Source"(源)视图,并构建名为 <tt>OpenActionPerformed()</tt> 的新事件处理程序方法。"Navigator"(导航器)窗口应如下所示:
<p class="align-center"><img alt="添加到菜单栏中的菜单项" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/openactionperformednavigator.png"></p></li>
<li>要添加菜单项,以便从正在创建的应用程序中退出文件选择器,并切换回 "Design"(设计)模式,请在 "Palette"(组件面板)的 "Swing Menus"(Swing 菜单)类别中,选择菜单项 (JMenuItem1),然后将其拖至 "Menu Bar"(菜单栏)中 "Open" 菜单项的下方。请注意橙色的突出显示,表示要放置 <tt>JMenuItem1</tt> 的位置。
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-filechooser/highlighting.png" rel="lytebox" title="突出显示"> <img alt="突出显示" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/highlighting-small.png"></a></p></li>
<li>在 "Design"(设计)视图中右键单击 <tt>jMenuItem1</tt>,然后从上下文菜单中选择 "Change Variable Name"(更改变量名称)。将项重命名为 <code>Exit</code>,然后单击 "OK"(确定)。</li>
<li>确保 <tt>jMenuItem1</tt> 在 "Design"(设计)视图中仍处于选中状态。按空格键编缉组件的文本。将文本更改为 <tt>Exit</tt>,然后按 Enter 键进行确认。</li>
<li>为 "Exit" 菜单项指定操作处理程序。右键单击菜单项,然后从上下文菜单中选择 "Events"(事件)> "Action"(操作)> "action Performed"(执行的操作)。GUI 构建器自动切换至 "Source"(源)视图,并将构建名为 <code>ExitActionPerformed()</code> 的新事件处理程序方法。<code>ExitActionPerformed</code> 节点显示在 "Navigator"(导航器)窗口中 <code>OpenActionPerformed()</code> 节点的下方。 </li>
<li>要使 "Exit" 菜单项正常工作,需要将以下源添加到 <code>ExitActionPerformed()</code> 方法的主体中:
<pre class="samplecode">
System.exit(0); </pre></li>
<li>切换回 "Design"(设计)模式。从 "Palette"(组件面板)的 "Swing Controls"(Swing 控件)类别中,将文本区域 (<tt>JTextArea</tt>) 拖入窗体中,如下图所示。
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-filechooser/textareadded.png" rel="lytebox" title="添加到 JForm 中的文本区域"> <img alt="添加到 JForm 中的文本区域" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/textareadded-small.png"></a></p></li>
<li>调整已添加组件的大小,以便为文件选择器稍后显示的文本留出空间。将变量重命名为 <code>textarea</code>。此窗体应该类似于下面的屏幕快照:
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-filechooser/jfilechooserdemoview_final.png" rel="lytebox" title="Java 应用程序 - GUI 构建器"> <img alt="Java 应用程序 - GUI 构建器" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/jfilechooserdemoview_final-small.png"></a></p></li>
</ol>
<p>您已设置了一个简单的 Java 应用程序作为本教程的基础。接下来,将添加实际的文件选择器。</p>
<h2><a name="filechooser"></a>添加文件选择器</h2>
<ol>
<li>选择 "Window"(窗口)> "Navigating"(导航)> "Navigator"(导航器)以打开 "Navigator"(导航器)窗口(如果该窗口尚未打开)。</li>
<li>在 "Navigator"(导航器)中,右键单击 <tt>Other Components</tt>(其他组件)节点。从上下文菜单中选择 "Add From Palette"(从组件面板上添加)> "Swing Windows"(Swing 窗口)> "File Chooser"(文件选择器)
<p class=tips>
除了 <tt>Add From Palette</tt>(从组件面板上添加)上下文菜单之外,还可以从 "Palette"(组件面板)的 "Swing Window"(Swing 窗口)将 <tt>JFileChooser</tt> 组件拖放至 GUI 构建器的空白区域。结果是一样的,但操作上有一些困难,因为 <tt>JFileChooser</tt> 的预览非常大,并且可能会不小心将窗口插入到错误的面板。</p>
</li>
<li>查看导航器,确认 <tt>JFileChooser</tt> 已添加到窗体中。
</li>
<li>右键单击 <tt>JFileChooser</tt> 节点,并将变量重命名为 <code>fileChooser</code>
<p class="align-center"><img alt="已添加文件选择器 - 导航器视图" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/navigator_jframe.png"></p></li>
</ol>
<p>您已添加了文件选择器。接下来,您要调整文件选择器以显示所需的标题,添加定制文件过滤器,然后将文件选择器集成到应用程序中。</p>
<h2><a name="config"></a>配置文件选择器</h2>
<h3>实现 "Open" 操作</h3>
<ol>
<li>在 "Navigator"(导航器)窗口中单击选择 <tt>JFileChooser</tt>,然后在 "Properties"(属性)对话框中编辑其属性。将 <tt>dialogTitle</tt> 属性更改为 <code>This is my open dialog</code>,按 Enter 键,然后关闭 "Properties"(属性)对话框。</li>
<li>
单击 GUI 构建器中的 "Source"(源)按钮,以切换至 "Source"(源)模式。要将文件选择器集成到应用程序中,请将以下代码片段粘贴到现有的 <code>OpenActionPerformed()</code> 方法中。
<pre class="samplecode">
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(&quot;problem accessing file&quot;+file.getAbsolutePath());
}
} else {
System.out.println(&quot;File access cancelled by user.&quot;);
}
} </pre>
<p class="notes"><b>注:</b>删除代码片段中与源文件中现有的第一行和最后一行重复的行。 </p></li>
<li>如果编辑器报告了代码中有错误,则右键单击代码中的任意位置,然后选择 "Fix Imports"(修复导入)或按 Ctrl+Shift+I 键。在 "Fix All Imports"(修复所有导入)对话框中,接受默认值以更新导入的语句,然后单击 "OK"(确定)。</li>
</ol>
<p>
正如您所看到的,调用 FileChooser 的 <tt>getSelectedFile()</tt> 方法来确认用户所单击的文件,以便您可以对其进行操作。本示例读取文件内容,并将其显示在文本区域中。
</p>
<h3>实现文件过滤器</h3>
<p>现在,您添加了使文件选择器只显示 <tt>*.txt</tt> 文件的定制文件过滤器。</p>
<ol>
<li>切换至 "Design"(设计)模式,然后在 "Navigator"(导航器)窗口中选择 <tt>fileChooser</tt></li>
<li>在 "Properties"(属性)窗口中,单击 <tt>fileFilter</tt> 属性旁边的省略号 ("...") 按钮。</li>
<li>在 "File Filter"(文件过滤器)对话框的组合框中,选择 "Custom Code"(定制代码)。
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-filechooser/combobox.png" rel="lytebox" title="组合框打开"> <img alt="组合框打开" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/combobox-small.png"></a></p></li>
<li>
在文本字段中键入 <tt>new MyCustomFilter()</tt>。单击 "OK"(确定)。
</li>
<li>
要使定制代码正常工作,需要编写内部(或外部)<tt>MyCustomFilter</tt> 类,以扩展 <tt>FileFilter</tt> 类。复制以下代码片段,并将其粘贴到类的源代码中 import 语句的下方,以创建实现过滤器的内部类。
<pre class="samplecode">
class MyCustomFilter extends javax.swing.filechooser.FileFilter {
@Override
public boolean accept(File file) {
// Allow only directories, or files with &quot;.txt&quot; extension
return file.isDirectory() || file.getAbsolutePath().endsWith(&quot;.txt&quot;);
}
@Override
public String getDescription() {
// This description will be displayed in the dialog,
// hard-coded = ugly, should be done via I18N
return &quot;Text documents (*.txt)&quot;;
}
} </pre></li>
</ol>
<p class=notes><b>注:</b>要了解如何实现更智能的、可切换的文件过滤器,请参见 <a href="http://java.sun.com/javase/7/docs/api/javax/swing/JFileChooser.html#addChoosableFileFilter%28javax.swing.filechooser.FileFilter%29" target="_blank" title="JDK API 文档">addChoosableFileFilter</a> 方法。
</p>
<h2><a name="run"></a>运行应用程序</h2>
<ol>
<li>右键单击 "JFileChooserDemo" 项目,然后选择 "Run"(运行),以启动样例项目。 </li>
<li>在 "Run Project"(运行项目)对话框中,选择 <code>jfilechooserdemo.resources.JFileChooserDemo</code> 主类,然后单击 "OK"(确定)。
<p class="align-center"><img alt="运行" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/run.png"></p>
</li>
<li>在正运行的 Demo 应用程序中,从 "File"(文件)菜单中选择 "Open"(打开),以触发相应操作。该结果应该与此类似:
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-filechooser/result_jfilechooserdemo.png" rel="lytebox" title="JFileChooser 演示 - 结果"> <img alt="JFileChooser 演示 - 结果" border="1/" src="../../../images_www/articles/72/java/gui-filechooser/result_jfilechooserdemo-small.png"></a></p>
</li>
<li>要关闭该应用程序,请在 "File"(文件)菜单中选择 "Exit"(退出)。 </li>
</ol>
<p>查看 GUI 组件面板中的其他有用 Swing 窗口和对话框,如 "ColorChooser"(颜色选择器)或 "OptionPane"(选项窗格)。</p>
<div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:%20Adding%20a%20FileChooser">发送有关此教程的反馈意见</a></div>
<br style="clear:both;" />
<h2><a name="next"></a>后续步骤</h2>
<ul>
<li><i>使用 NetBeans IDE 开发应用程序</i>中的<a href="http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG920">实现 Java GUI</a>
<li><a href="gui-binding.html">通过 NetBeans IDE 在 Java 应用程序中绑定 Bean 和数据</a></li>
<li><a href="gui-automatic-i18n.html">用 NetBeans IDE 国际化 GUI 窗体</a></li>
<li><a href="http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html" target="_blank" title="如何使用文件选择器">Java 教程:如何使用文件选择器</a> </li>
</ul>
</body>
</html>