| // |
| // 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. |
| // |
| |
| = NetBeans 插件快速入门 |
| :jbake-type: platform_tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :icons: font |
| :experimental: |
| :description: NetBeans 插件快速入门 - Apache NetBeans |
| :keywords: Apache NetBeans Platform, Platform Tutorials, NetBeans 插件快速入门 |
| |
| 欢迎了解有关开发 NetBeans 插件的知识! |
| |
| 本教程将指导您为 NetBeans IDE 创建一个新的工具栏,从而为 NetBeans 插件的开发工作流程提供一个快速简介。学习完本教程后,您将对如何为 NetBeans IDE 创建、生成和安装插件有一个基本了解。 |
| |
| 完成本教程后,您可以继续参阅 link:https://netbeans.apache.org/kb/docs/platform_zh_CN.html[NetBeans 平台学习资源]。该学习资源提供了综合性教程,这些教程重点介绍适用各种应用程序类型的一系列 NetBeans API。如果您不希望创建 "Hello World" 应用程序,则可以跳过本教程,而直接阅读学习资源。 |
| |
| *注意:*本文档使用的是 NetBeans IDE 6.8 发行版。如果使用的是早期版本,请参见 link:67/nbm-google_zh_CN.html[本文档的 6.7 版]。 |
| |
| |
| |
| |
| |
| |
| |
| (可选)要解决疑难问题,可以 link:http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=13794[下载完整的样例]并查看其源代码。 |
| |
| 您在本教程中创建的工具栏将如下所示: |
| |
| |
| image::images/google_60_googlebar-2.png[] |
| |
| 当用户在以上工具栏中按 Enter 键时,IDE 的缺省浏览器打开,同时工具栏中的文本会发送至 Google 搜索,并在打开的浏览器中显示搜索结果。要创建此工具栏,您可以使用 link:http://bits.netbeans.org/dev/javadoc/[NetBeans API] 来增强 IDE 的功能集。具体而言,您将创建一个由工具栏中的按钮所调用的操作。然后,再创建一个包含 GUI 组件 ``JLabel`` 和 ``JTextField`` 的 Swing JPanel。最后,您将实现用于返回 JPanel 的 link:http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/Presenter.Toolbar.html[ ``Presenter.Toolbar`` ],以使 JPanel 显示在工具栏而不是按钮中。 |
| |
| |
| == 设置模块项目 |
| |
| 开发模块时,必须确保正确设置项目的结构。NetBeans IDE 提供了一个模块项目向导,用于设置模块所需的全部基本文件。 |
| |
| |
| [start=1] |
| 1. 选择“文件”>“新建项目”(Ctrl+Shift+N)。在“类别”下选择“NetBeans 模块”。在“项目”下选择“模块”。单击“下一步”。 |
| |
| [start=2] |
| 1. 在“名称和位置”面板的“项目名称”字段中键入 ``GoogleToolbar`` 。将项目位置更改为计算机上的任意目录。将“独立模块”选项和“设置为主项目”复选框保留为选中状态。单击“下一步”。 |
| |
| [start=3] |
| 1. 在“基本模块配置”面板的“代码名称基”中键入 ``org.myorg.googletoolbar`` 。 |
| |
| [start=4] |
| 1. 选择“生成 XML 层”。保留本地化包和 XML 层文件的位置,以将其存储在名为 ``org/myorg/googletoolbar`` 的包中。单击“完成”。 |
| |
| IDE 将创建 ``GoogleToolbar`` 项目。此项目包含所有源代码和项目 meta 数据,例如项目的 Ant 生成脚本。此项目在 IDE 中打开。您可以在“项目”窗口 (Ctrl+1) 中查看其逻辑结构,在“文件”窗口 (Ctrl+2) 中查看其文件结构。 |
| |
| 如果展开“重要文件”节点,则可以打开“模块清单”,其内容如下所示: |
| |
| |
| [source,java] |
| ---- |
| |
| Manifest-Version: 1.0 |
| OpenIDE-Module: org.myorg.googletoolbar |
| OpenIDE-Module-Layer: org/myorg/googletoolbar/layer.xml |
| OpenIDE-Module-Localizing-Bundle: org/myorg/googletoolbar/Bundle.properties |
| OpenIDE-Module-Specification-Version: 1.0 |
| ---- |
| |
| 有关这些特定于 NetBeans 的清单键的详细信息,请参阅 link:http://bits.netbeans.org/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html[NetBeans 模块 API] Javadoc 描述。 |
| |
| |
| |
| == 编写模块代码 |
| |
| 要编写模块代码,需要完成以下步骤: |
| |
| * <<creating-action,创建操作>> |
| * <<creating-panel,创建 JPanel>> |
| * <<resolving-errors,解决错误>> |
| * <<overriding,重写 getToolbarPresenter()>> |
| |
| |
| === 创建操作 |
| |
| |
| [start=1] |
| 1. 右键单击项目节点,然后选择“新建”>“操作”(如果未显示“操作”,请选择“其他”,然后在“新建文件”向导的“类别”下选择“模块开发”,此时应显示“操作”)。单击“下一步”。 |
| |
| [start=2] |
| 1. 在“操作类型”面板中保留缺省设置(IDE 可以通过此设置创建作为 ``ActionListener`` 子类的操作),如下所示: |
| image::images/google_65_action-wiz-1.png[] 单击“下一步”。 |
| |
| [start=3] |
| 1. 在“GUI 注册”面板中,从“类别”下拉列表中选择“文件”。“类别”下拉列表用于控制操作在 IDE 的快捷键编辑器中的显示位置。接下来,取消选中“全局菜单项”,然后选中“全局工具栏按钮”。在“工具栏”下拉列表中选择“文件”,然后在“位置”下拉列表中选择“下拉列表中的任何位置”,如下所示: |
| image::images/google_65_action-wiz-2.png[] 单击“下一步”。 |
| |
| [start=4] |
| 1. |
| 在“名称和位置”面板的“类名”中键入 ``GoogleAction`` ,在“显示名称”中键入 ``Google Action`` 。找到一个尺寸为 16x16 像素的图标。实际上,您不会用到这个图标,真正显示的图标将是下面一节中创建的 JPanel 窗体。只是,“新建操作”向导要求指定一个图标。因此,该图标可以是任意尺寸,因为您根本不会用到它。单击“完成”。 |
| |
| *注意:* ``GoogleAction.java`` 将被添加到“项目”窗口的 ``org.myorg.googletoolbar`` 包中。 |
| |
| |
| === 创建 JPanel |
| |
| 在此部分,将创建一个 JPanel 作为工具栏,它将显示在应用程序主工具栏中。 |
| |
| |
| [start=1] |
| 1. 右键单击项目节点,然后选择“新建”>“其他”。在“类别”下,选择“Swing GUI 窗体”。在“项目”下选择“JPanel 窗体”。单击“下一步”。 |
| |
| [start=2] |
| 1. 在“名称和位置”面板的“类名”中键入 ``GooglePanel`` ,然后从下拉列表中选择包。单击“完成”。 ``GooglePanel.java`` 将被添加到该包中,并在源代码编辑器的“设计”视图中将其打开。 |
| |
| [start=3] |
| 1. 将光标放在 JPanel 的右下角,然后选择 JPanel 并拖动光标来调整大小,以使其宽度和长度与工具栏类似,如下所示: |
| image::images/google_60_jpanel-2.png[] |
| |
| [start=4] |
| 1. 将一个 JTextField 项和一个 JLabel 项从组件面板 (Ctrl+Shift+8) 直接拖至 JPanel 中,然后调整 JPanel 及另外两个项的大小,使它们排放适宜。最后,单击 JLabel 并将其文本更改为 ``Google:`` ,然后删除 JTextField 中的缺省文本。现在,您的 JPanel 应该与下面显示的图像类似: |
| image::images/google_60_jpanel-3.png[] |
| |
| [start=5] |
| 1. 确保属性检查器(“窗口”>“导航”>“检查器”)处于打开状态,然后右键单击 JTextField 并选择“事件”> "Key" > "keyTyped"。这将在 ``GooglePanel.java`` 源代码中生成一个 ``jTextField1KeyTyped()`` 方法,并将其显示在源代码编辑器中,如下所示: |
| image::images/google_60_jpanel-4.png[] |
| |
| [start=6] |
| 1. 在源代码编辑器的 ``GooglePanel.java`` “源”视图中,填写 ``jTextField1KeyTyped()`` 方法,如下所示(插入的文本以*粗体*显示): |
| |
| [source,java] |
| ---- |
| |
| |
| private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) { |
| *int i = evt.getKeyChar(); |
| if (i==10){//The ENTER KEY |
| // we display the google url. |
| try{ |
| URLDisplayer.getDefault().showURL |
| (new URL("http://www.google.com/search?hl=en&q="+jTextField1.getText()+"&btnG=Google+Search")); |
| } catch (Exception eee){ |
| return;//nothing much to do |
| } |
| }* |
| } |
| ---- |
| |
| 如果需要,请在源代码编辑器中单击鼠标右键,然后选择“格式化”(Alt+Shift+F)。 |
| |
| |
| === 解决错误 |
| |
| 请注意,某个代码行带有红色下划线,这表示存在错误。其原因是尚未导入所需的包。将光标置于紧邻 ``URLDisplayer`` 所在行(带有红色下划线)左侧的栏中显示的灯泡图标上。随即显示一条工具提示,说明出现此错误的原因: |
| |
| |
| image::images/google_60_tooltip.png[] |
| |
| 为了解决此错误,需要让您的项目可访问 `` link:http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/HtmlBrowser.URLDisplayer.html[HtmlBrowser.URLDisplayer]`` 类(包含在 link:http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/package-summary.html[ ``org.openide.awt`` ] 包中)。为此,请执行以下步骤: |
| |
| |
| [start=1] |
| 1. 右键单击“项目”窗口中的项目节点,然后选择“属性”。在显示的“项目属性”对话框中,选择“类别”标题下的“库”。然后,在“模块依赖关系”下,单击“添加”按钮。将显示“添加模块依赖关系”对话框。 |
| |
| [start=2] |
| 1. 在“添加模块依赖关系”对话框顶部显示的过滤器文本框中,开始键入 `` link:http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/HtmlBrowser.URLDisplayer.html[URLDisplayer]`` ,请注意返回的模块的选择范围会逐渐缩小,直到列表中仅留有“ link:http://bits.netbeans.org/dev/javadoc/org-openide-awt/overview-summary.html[UI 实用程序 API]”: |
| image::images/google_60_add-module-dependency.png[] 单击“确定”,然后再次单击“确定”退出“项目属性”对话框。 |
| |
| [start=3] |
| 1. 在源代码编辑器中单击鼠标右键,然后选择“修复导入”(Alt+Shift+F)。将显示“修复所有导入”对话框,其中列出了针对无法识别的类的建议路径: |
| image::images/google_60_fix-all-imports.png[] 单击“确定”。IDE 将为 ``GooglePanel.java`` 创建以下 import 语句: |
| |
| [source,java] |
| ---- |
| |
| import java.net.URL; |
| import link:http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/HtmlBrowser.URLDisplayer.html[org.openide.awt.HtmlBrowser.URLDisplayer]; |
| |
| ---- |
| |
| 另请注意,源代码编辑器中的所有错误将会消失。 |
| |
| |
| === 实现 Presenter.Toolbar |
| |
| 由于您刚创建的 JPanel 是将显示 Google 工具栏的实际组件,因此您需要实现 `` link:http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/Presenter.Toolbar.html[Presenter.Toolbar]`` 以使该组件显示在工具栏中。在 ``GoogleAction.java`` 中,执行以下操作: |
| |
| |
| [start=1] |
| 1. 打开 ``GoogleAction.java`` ,将会注意到它包含以下内容: |
| |
| [source,java] |
| ---- |
| |
| |
| package org.myorg.googletoolbar; |
| |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| |
| public final class GoogleAction implements ActionListener { |
| |
| public void actionPerformed(ActionEvent e) { |
| // TODO implement action body |
| } |
| |
| } |
| ---- |
| |
| |
| [start=2] |
| 1. 更改签名,以便 `` link:http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/Presenter.Toolbar.html[Presenter.Toolbar]`` 也得以实现,因为您希望在工具栏中显示该操作。 |
| |
| [source,java] |
| ---- |
| |
| package org.myorg.googletoolbar; |
| |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| |
| public final class GoogleAction implements Presenter.Toolbar, ActionListener { |
| |
| Component comp = new GooglePanel(); |
| |
| @Override |
| public void actionPerformed(ActionEvent e) { |
| // TODO implement action body |
| } |
| |
| @Override |
| public Component getToolbarPresenter() { |
| return comp; |
| } |
| |
| } |
| ---- |
| |
| |
| [start=3] |
| 1. 打开 ``layer.xml`` 文件中,将会看到以下内容: |
| |
| [source,xml] |
| ---- |
| |
| |
| <?xml version="1.0" encoding="UTF-8"?> |
| <!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "https://netbeans.org/dtds/filesystem-1_2.dtd"> |
| <filesystem> |
| <folder name="Actions"> |
| <folder name="File"> |
| <file name="org-myorg-googletoolbar-GoogleAction.instance"> |
| <attr name="SystemFileSystem.localizingBundle" stringvalue="org.myorg.googletoolbar.Bundle"/> |
| <attr name="delegate" newvalue="org.myorg.googletoolbar.GoogleAction"/> |
| <attr name="displayName" bundlevalue="org.myorg.googletoolbar.Bundle#CTL_GoogleAction"/> |
| <attr name="iconBase" stringvalue="org/myorg/googletoolbar/icon.png"/> |
| <attr name="instanceCreate" methodvalue="org.openide.awt.Actions.alwaysEnabled"/> |
| <attr name="noIconInMenu" stringvalue="false"/> |
| </file> |
| </folder> |
| </folder> |
| <folder name="Toolbars"> |
| <folder name="File"> |
| <file name="org-myorg-googletoolbar-GoogleAction.shadow"> |
| <attr name="originalFile" stringvalue="Actions/File/org-myorg-googletoolbar-GoogleAction.instance"/> |
| <attr name="position" intvalue="0"/> |
| </file> |
| </folder> |
| </folder> |
| </filesystem> |
| ---- |
| |
| |
| [start=4] |
| 1. 上面显示的内容是由“新建操作”向导创建的。删除 "instanceCreate" 属性,因为在本例中,您不希望创建操作类的实例。毕竟,此时您希望 JPanel 显示在该位置。 |
| |
| 在此部分,已创建了一个用于显示 JTextField 和 JLabel 的 JPanel。在 JTextField 中按 Enter 键时,其内容将发送到 Google 搜索。HTML 浏览器打开,您会看到 Google 搜索结果。该操作类用于在 ``layer.xml`` 文件中注册的应用程序工具栏内集成 JPanel。 |
| |
| |
| |
| == 编译、安装和使用模块 |
| |
| NetBeans IDE 使用 Ant 生成脚本在 IDE 中编译和安装模块。当在上面的<<creating-module-project,设置模块项目>>一节中创建了模块项目之后,系统会自动为您创建生成脚本。现在,您可以对模块进行编译并将其添加到 IDE 中,利用 NetBeans IDE 的 Ant 支持可以执行此操作: |
| |
| |
| [start=1] |
| 1. 在“项目”窗口中,右键单击 " ``GoogleToolbar`` " 项目节点并选择“运行”。将生成模块并将其安装在 IDE 的新实例(即目标平台)中。缺省情况下,缺省目标平台是您当前所使用的 IDE 版本。目标平台打开,您可以在其中试用新模块。 |
| |
| [start=2] |
| 1. 成功安装模块后,它会在 IDE 的“编辑”工具栏中添加一个新按钮。 |
| |
| *注意:*此工具栏按钮不显示图标,而是显示您在上面的<<creating-panel,创建 JPanel>> 一节中创建的 JPanel: |
| |
| |
| image::images/google_60_googlebar.png[] |
| |
| |
| [start=3] |
| 1. 在文本字段中键入一个搜索字符串: |
| image::images/google_60_googlebar-2.png[] |
| |
| [start=4] |
| 1. 按 Enter 键。如果在“选项”窗口中设置了 IDE 缺省浏览器,则会启动该浏览器。Google URL 和搜索字符串将被发送至浏览器,并且系统会执行搜索。返回搜索结果后,可以在浏览器中查看结果。 |
| |
| |
| |
| == 共享模块 |
| |
| 既然您已经生成了一个可增强 IDE 功能的有效模块,为什么不与其他开发者一起共享呢?NetBeans IDE 提供了一种创建二进制 NetBeans 模块文件 (.nbm) 的简便方法,这是允许他人可以在自己的 IDE 版本中试用该模块文件的通用方法(实际上,这就是您在上面的<<compiling,编译、安装和使用模块>>中所执行的操作)。 |
| |
| 要创建模块二进制文件,请执行以下操作: |
| |
| 在“项目”窗口中,右键单击 "GoogleToolbar" 项目节点,然后选择“创建 NBM”。将创建新的 NBM 文件,您可以在“文件”窗口 (Ctrl+2) 中查看它: |
| |
| |
| image::images/google_60_create-nbm.png[] |
| |
| link:http://netbeans.apache.org/community/mailing-lists.html[请将您的意见和建议发送给我们] |
| |
| |
| |
| == 另请参见 |
| |
| “NetBeans 插件快速入门”教程到此结束。本文档介绍了如何创建用于在 IDE 中添加 Google 搜索工具栏的插件。有关创建和开发插件的详细信息,请参见以下资源: |
| |
| * link:https://netbeans.apache.org/kb/docs/platform_zh_CN.html[NetBeans 平台学习资源] |
| * link:http://bits.netbeans.org/dev/javadoc/[NetBeans API Javadoc] |
| * 本教程中使用的 NetBeans API 类: |
| * `` link:http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/HtmlBrowser.URLDisplayer.html[HtmlBrowser.URLDisplayer]`` |
| * `` link:http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/Presenter.Toolbar.html[Presenter.Toolbar]`` |