| // |
| // 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"] |
| -- |
| |
| |
| |
| . 单击 "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"] |
| -- |
| |
| |
| |
| . 单击 "Finish"(完成)。 |
| |
| |
| . 在 "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"] |
| -- |
| |
| |
| |
| . 右键单击 "Menu Bar"(菜单栏)组件的 "Edit"(编辑)项,然后在上下文菜单中选择 "Delete"(删除)。 |
| |
| |
| . 要添加菜单项,以便从正在运行的应用程序打开文件选择器,请在 "Palette"(组件面板)的 "Swing Menus"(Swing 菜单)类别中,选择新的菜单项 (JMenuItem1),然后将其拖放至 "Menu Bar"(菜单栏)的 "File"(文件)项。 |
| |
| [.feature] |
| -- |
| image::images/menuitemadded-small.png[role="left", link="images/menuitemadded.png"] |
| -- |
| |
| *注:*请确保先选择 "Menu Bar"(菜单栏),然后再将其他菜单项拖至此处,以便将后者添加到 "Menu Bar"(菜单栏)中。 |
| |
| |
| |
| . 在 "Design"(设计)视图中右键单击 jMenuItem1,然后从上下文菜单中选择 "Change Variable Name"(更改变量名称)。将项重命名为 `Open`,然后单击 "OK"(确定)。 |
| |
| |
| . 确保 jMenuItem1 在 "Design"(设计)视图中仍处于选中状态。按空格键编缉组件的文本。将文本更改为 `Open`,然后按 Enter 键进行确认。 |
| |
| |
| . 为 "Open" 菜单项指定操作处理程序。右键单击菜单项,然后从上下文菜单中选择 "Events"(事件)> "Action"(操作)> "action Performed"(执行的操作)。GUI 构建器自动切换至 "Source"(源)视图,并构建名为 ``OpenActionPerformed()`` 的新事件处理程序方法。"Navigator"(导航器)窗口应如下所示: |
| |
| image::images/openactionperformednavigator.png[] |
| |
| |
| |
| . 要添加菜单项,以便从正在创建的应用程序中退出文件选择器,并切换回 "Design"(设计)模式,请在 "Palette"(组件面板)的 "Swing Menus"(Swing 菜单)类别中,选择菜单项 (JMenuItem1),然后将其拖至 "Menu Bar"(菜单栏)中 "Open" 菜单项的下方。请注意橙色的突出显示,表示要放置 ``JMenuItem1`` 的位置。 |
| |
| [.feature] |
| -- |
| image::images/highlighting-small.png[role="left", link="images/highlighting.png"] |
| -- |
| |
| |
| |
| . 在 "Design"(设计)视图中右键单击 ``jMenuItem1`` ,然后从上下文菜单中选择 "Change Variable Name"(更改变量名称)。将项重命名为 `Exit`,然后单击 "OK"(确定)。 |
| |
| |
| . 确保 ``jMenuItem1`` 在 "Design"(设计)视图中仍处于选中状态。按空格键编缉组件的文本。将文本更改为 ``Exit`` ,然后按 Enter 键进行确认。 |
| |
| |
| . 为 "Exit" 菜单项指定操作处理程序。右键单击菜单项,然后从上下文菜单中选择 "Events"(事件)> "Action"(操作)> "action Performed"(执行的操作)。GUI 构建器自动切换至 "Source"(源)视图,并将构建名为 `ExitActionPerformed()` 的新事件处理程序方法。`ExitActionPerformed` 节点显示在 "Navigator"(导航器)窗口中 `OpenActionPerformed()` 节点的下方。 |
| |
| |
| . 要使 "Exit" 菜单项正常工作,需要将以下源添加到 `ExitActionPerformed()` 方法的主体中: |
| |
| [source,java] |
| ---- |
| |
| System.exit(0); |
| ---- |
| |
| |
| . 切换回 "Design"(设计)模式。从 "Palette"(组件面板)的 "Swing Controls"(Swing 控件)类别中,将文本区域 ( ``JTextArea`` ) 拖入窗体中,如下图所示。 |
| |
| [.feature] |
| -- |
| image::images/textareadded-small.png[role="left", link="images/textareadded.png"] |
| -- |
| |
| |
| |
| . 调整已添加组件的大小,以便为文件选择器稍后显示的文本留出空间。将变量重命名为 `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`` 的预览非常大,并且可能会不小心将窗口插入到错误的面板。 |
| |
| |
| |
| . 查看导航器,确认 ``JFileChooser`` 已添加到窗体中。 |
| |
| |
| . 右键单击 ``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."); |
| } |
| } |
| ---- |
| |
| *注:*删除代码片段中与源文件中现有的第一行和最后一行重复的行。 |
| |
| |
| |
| . 如果编辑器报告了代码中有错误,则右键单击代码中的任意位置,然后选择 "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"] |
| -- |
| |
| |
| |
| . 在文本字段中键入 ``new MyCustomFilter()`` 。单击 "OK"(确定)。 |
| |
| |
| . 要使定制代码正常工作,需要编写内部(或外部) ``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[] |
| |
| |
| |
| . 在正运行的 Demo 应用程序中,从 "File"(文件)菜单中选择 "Open"(打开),以触发相应操作。该结果应该与此类似: |
| |
| [.feature] |
| -- |
| image::images/result_jfilechooserdemo-small.png[role="left", link="images/result_jfilechooserdemo.png"] |
| -- |
| |
| |
| |
| . 要关闭该应用程序,请在 "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 教程:如何使用文件选择器+] |