blob: 7bfde95fd7d039dd36f557a3b5ad8083d7dcf566 [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= Java 应用程序添加文件选择器
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Java 应用程序添加文件选择器 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Java 应用程序添加文件选择器
_撰稿人:Petr Dvoraklink:http://blogs.oracle.com/joshis/entry/a_quick_jfilechooser_demo[+(2009 年 12 月)+],维护人:Alyona Stashkova_
本教程介绍了如何使用 ``javax.swing.JFileChooser`` 组件向 Java 应用程序中添加文件选择器。可以手动编写所有代码,但使用 NetBeans GUI 构建器是明智的选择,它可以减轻工作量。在此练习中,将创建一个小的 Java 应用程序,用于将 ``.txt`` 文件加载到文本区域中。
可以link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%252FJFileChooserDemo.zip[+使用文件选择器下载生成的项目+]。
image::images/netbeans-stamp-80-74-73.png[title="此页上的内容适用于 NetBeans IDE 7.0 及更高版本"]
*要学完本教程,您需要具备以下软件和资源。*
|===
|软件或资源 |要求的版本
|link:http://netbeans.org/downloads/[+NetBeans IDE+] |版本 7.0 或更高版本
|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java 开发工具包+] (JDK) |版本 6、7 或 8
|===
== 创建应用程序
首先创建一个新的 Java 应用程序:
1. 从主菜单中,选择 "File"(文件)> "New Project"(新建项目)。选择 "Java" 类别和 "Java Application"Java 应用程序)项目类型。单击 "Next"(下一步)。
2. 键入 `JFileChooserDemo` 作为项目名称,并指定项目位置。
3. 取消选中 "Create Main Class"(创建主类)复选框。
[.feature]
--
image::images/newproj-small.png[role="left", link="images/newproj.png"]
--
[start=4]
. 单击 "Finish"(完成)。
== 创建应用程序窗体
在本部分中,将创建 ``JFrame`` 容器,并向其中添加几个组件。
*要创建 JFrame 窗体,请执行以下操作:*
1. 右键单击 "Source Packages"(源包)节点,然后选择 "New"(新建)> "Other"(其他)。选择 "Swing GUI Forms"Swing GUI 窗体)类别和 "JFrameForm" 文件类型。单击 "Next"(下一步)。
2. 键入 `JFileChooserDemo` 作为类名。
3. 键入 `jfilechooserdemo.resources` 作为包。
[.feature]
--
image::images/newjframeform-small.png[role="left", link="images/newjframeform.png"]
--
[start=4]
. 单击 "Finish"(完成)。
[start=5]
. "Properties"(属性)窗口中,输入 `Demo application` 作为 "Title"(标题)属性,然后按 Enter 键进行确认。
*将组件添加到 JFrame 窗体中:*
1. "Palette"(组件面板)中,打开 "Swing Menus"Swing 菜单)类别,选择 "Menu Bar"(菜单栏)组件,然后将其拖至 JFrame 的左上角。
*注:*如果未显示 "Palette"(组件面板),请从主菜单中选择 "Window"(窗口)> "Palette"(组件面板)。
[.feature]
--
image::images/menubaradded-small.png[role="left", link="images/menubaradded.png"]
--
[start=2]
. 右键单击 "Menu Bar"(菜单栏)组件的 "Edit"(编辑)项,然后在上下文菜单中选择 "Delete"(删除)。
[start=3]
. 要添加菜单项,以便从正在运行的应用程序打开文件选择器,请在 "Palette"(组件面板)的 "Swing Menus"Swing 菜单)类别中,选择新的菜单项 (JMenuItem1),然后将其拖放至 "Menu Bar"(菜单栏)的 "File"(文件)项。
[.feature]
--
image::images/menuitemadded-small.png[role="left", link="images/menuitemadded.png"]
--
*注:*请确保先选择 "Menu Bar"(菜单栏),然后再将其他菜单项拖至此处,以便将后者添加到 "Menu Bar"(菜单栏)中。
[start=4]
. "Design"(设计)视图中右键单击 jMenuItem1,然后从上下文菜单中选择 "Change Variable Name"(更改变量名称)。将项重命名为 `Open`,然后单击 "OK"(确定)。
[start=5]
. 确保 jMenuItem1 "Design"(设计)视图中仍处于选中状态。按空格键编缉组件的文本。将文本更改为 `Open`,然后按 Enter 键进行确认。
[start=6]
. "Open" 菜单项指定操作处理程序。右键单击菜单项,然后从上下文菜单中选择 "Events"(事件)> "Action"(操作)> "action Performed"(执行的操作)。GUI 构建器自动切换至 "Source"(源)视图,并构建名为 ``OpenActionPerformed()`` 的新事件处理程序方法。"Navigator"(导航器)窗口应如下所示:
image::images/openactionperformednavigator.png[]
[start=7]
. 要添加菜单项,以便从正在创建的应用程序中退出文件选择器,并切换回 "Design"(设计)模式,请在 "Palette"(组件面板)的 "Swing Menus"Swing 菜单)类别中,选择菜单项 (JMenuItem1),然后将其拖至 "Menu Bar"(菜单栏)中 "Open" 菜单项的下方。请注意橙色的突出显示,表示要放置 ``JMenuItem1`` 的位置。
[.feature]
--
image::images/highlighting-small.png[role="left", link="images/highlighting.png"]
--
[start=8]
. "Design"(设计)视图中右键单击 ``jMenuItem1`` ,然后从上下文菜单中选择 "Change Variable Name"(更改变量名称)。将项重命名为 `Exit`,然后单击 "OK"(确定)。
[start=9]
. 确保 ``jMenuItem1`` "Design"(设计)视图中仍处于选中状态。按空格键编缉组件的文本。将文本更改为 ``Exit`` ,然后按 Enter 键进行确认。
[start=10]
. "Exit" 菜单项指定操作处理程序。右键单击菜单项,然后从上下文菜单中选择 "Events"(事件)> "Action"(操作)> "action Performed"(执行的操作)。GUI 构建器自动切换至 "Source"(源)视图,并将构建名为 `ExitActionPerformed()` 的新事件处理程序方法。`ExitActionPerformed` 节点显示在 "Navigator"(导航器)窗口中 `OpenActionPerformed()` 节点的下方。
[start=11]
. 要使 "Exit" 菜单项正常工作,需要将以下源添加到 `ExitActionPerformed()` 方法的主体中:
[source,java]
----
System.exit(0);
----
[start=12]
. 切换回 "Design"(设计)模式。从 "Palette"(组件面板)的 "Swing Controls"Swing 控件)类别中,将文本区域 ( ``JTextArea`` ) 拖入窗体中,如下图所示。
[.feature]
--
image::images/textareadded-small.png[role="left", link="images/textareadded.png"]
--
[start=13]
. 调整已添加组件的大小,以便为文件选择器稍后显示的文本留出空间。将变量重命名为 `textarea`。此窗体应该类似于下面的屏幕快照:
[.feature]
--
image::images/jfilechooserdemoview_final-small.png[role="left", link="images/jfilechooserdemoview_final.png"]
--
您已设置了一个简单的 Java 应用程序作为本教程的基础。接下来,将添加实际的文件选择器。
== 添加文件选择器
1. 选择 "Window"(窗口)> "Navigating"(导航)> "Navigator"(导航器)以打开 "Navigator"(导航器)窗口(如果该窗口尚未打开)。
2. "Navigator"(导航器)中,右键单击 ``Other Components`` (其他组件)节点。从上下文菜单中选择 "Add From Palette"(从组件面板上添加)> "Swing Windows"Swing 窗口)> "File Chooser"(文件选择器)
除了 ``Add From Palette`` (从组件面板上添加)上下文菜单之外,还可以从 "Palette"(组件面板)的 "Swing Window"Swing 窗口)将 ``JFileChooser`` 组件拖放至 GUI 构建器的空白区域。结果是一样的,但操作上有一些困难,因为 ``JFileChooser`` 的预览非常大,并且可能会不小心将窗口插入到错误的面板。
[start=3]
. 查看导航器,确认 ``JFileChooser`` 已添加到窗体中。
[start=4]
. 右键单击 ``JFileChooser`` 节点,并将变量重命名为 `fileChooser`
image::images/navigator_jframe.png[]
您已添加了文件选择器。接下来,您要调整文件选择器以显示所需的标题,添加定制文件过滤器,然后将文件选择器集成到应用程序中。
== 配置文件选择器
=== 实现 "Open" 操作
1. "Navigator"(导航器)窗口中单击选择 ``JFileChooser`` ,然后在 "Properties"(属性)对话框中编辑其属性。将 ``dialogTitle`` 属性更改为 `This is my open dialog`,按 Enter 键,然后关闭 "Properties"(属性)对话框。
2. 单击 GUI 构建器中的 "Source"(源)按钮,以切换至 "Source"(源)模式。要将文件选择器集成到应用程序中,请将以下代码片段粘贴到现有的 `OpenActionPerformed()` 方法中。
[source,java]
----
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.");
}
}
----
*注:*删除代码片段中与源文件中现有的第一行和最后一行重复的行。
[start=3]
. 如果编辑器报告了代码中有错误,则右键单击代码中的任意位置,然后选择 "Fix Imports"(修复导入)或按 Ctrl+Shift+I 键。在 "Fix All Imports"(修复所有导入)对话框中,接受默认值以更新导入的语句,然后单击 "OK"(确定)。
正如您所看到的,调用 FileChooser ``getSelectedFile()`` 方法来确认用户所单击的文件,以便您可以对其进行操作。本示例读取文件内容,并将其显示在文本区域中。
=== 实现文件过滤器
现在,您添加了使文件选择器只显示 ``*.txt`` 文件的定制文件过滤器。
1. 切换至 "Design"(设计)模式,然后在 "Navigator"(导航器)窗口中选择 ``fileChooser``
2. "Properties"(属性)窗口中,单击 ``fileFilter`` 属性旁边的省略号 ("...") 按钮。
3. "File Filter"(文件过滤器)对话框的组合框中,选择 "Custom Code"(定制代码)。
[.feature]
--
image::images/combobox-small.png[role="left", link="images/combobox.png"]
--
[start=4]
. 在文本字段中键入 ``new MyCustomFilter()`` 。单击 "OK"(确定)。
[start=5]
. 要使定制代码正常工作,需要编写内部(或外部) ``MyCustomFilter`` 类,以扩展 ``FileFilter`` 类。复制以下代码片段,并将其粘贴到类的源代码中 import 语句的下方,以创建实现过滤器的内部类。
[source,java]
----
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)";
}
}
----
*注:*要了解如何实现更智能的、可切换的文件过滤器,请参见 link:http://java.sun.com/javase/7/docs/api/javax/swing/JFileChooser.html#addChoosableFileFilter%28javax.swing.filechooser.FileFilter%29[+addChoosableFileFilter+] 方法。
== 运行应用程序
1. 右键单击 "JFileChooserDemo" 项目,然后选择 "Run"(运行),以启动样例项目。
2. "Run Project"(运行项目)对话框中,选择 `jfilechooserdemo.resources.JFileChooserDemo` 主类,然后单击 "OK"(确定)。
image::images/run.png[]
[start=3]
. 在正运行的 Demo 应用程序中,从 "File"(文件)菜单中选择 "Open"(打开),以触发相应操作。该结果应该与此类似:
[.feature]
--
image::images/result_jfilechooserdemo-small.png[role="left", link="images/result_jfilechooserdemo.png"]
--
[start=4]
. 要关闭该应用程序,请在 "File"(文件)菜单中选择 "Exit"(退出)。
查看 GUI 组件面板中的其他有用 Swing 窗口和对话框,如 "ColorChooser"(颜色选择器)或 "OptionPane"(选项窗格)。
link:/about/contact_form.html?to=3&subject=Feedback:%20Adding%20a%20FileChooser[+发送有关此教程的反馈意见+]
== 后续步骤
* _使用 NetBeans IDE 开发应用程序_中的link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG920[+实现 Java GUI+]
* link:gui-binding.html[+通过 NetBeans IDE Java 应用程序中绑定 Bean 和数据+]
* link:gui-automatic-i18n.html[+用 NetBeans IDE 国际化 GUI 窗体+]
* link:http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html[+Java 教程:如何使用文件选择器+]