NetBeans Anagram Game 模块教程
反馈
本教程演示 NetBeans Windows API 的各个方面。它介绍如何在 IDE 中通过顶部组件停靠或嵌入 NetBeans Anagram Game。顶部组件可能与单个窗口相对应,但是也可能与窗口中的选项卡相对应。可以停靠或取消停靠、拥有选定的节点、提供操作并提供其他支持功能。有关顶部组件的技术详细信息,请参阅 Class TopComponent(位于 NetBeans API 列表中)。
本教程将介绍以下主题:
安装完软件之后,本教程可以在 45 分钟之内完成。
有关使用 NetBeans 插件模块的详细信息,请参阅 NetBeans 网站上的 NetBeans Development Project 主页。如果有问题,请访问 NetBeans Developer FAQ 或使用本页顶部的反馈链接。
安装软件
开始之前,需要在您的计算机上安装以下软件:
- NetBeans IDE 5.0(下载)
- Java Standard Development Kit (JDK™) version 1.4.2(下载)或 5.0(下载)
安装示例
采用以下步骤来安装示例:
- 解压缩附加的文件。
- 在 IDE 中,选择 File > Open Project,然后浏览到包含已解压缩文件的文件夹。打开模块项目。其形式如下:
- 右键单击项目节点并在 Target Platform 中选择 Install/Reload。将打开目标平台并安装该模块。
注意到您拥有了一个新菜单:
- 选择新菜单。打开 Anagram Game 以及 Projects 窗口、Files 窗口和 Runtime 窗口并以“explorer”模式停靠。
- 玩游戏。
知道了最终结果后,将从头开始创建模块,并且在创建的同时了解每个部分。
设置项目
创建模块项目
- 选择 File > New Project (Ctrl-Shift-N)。在 Categories 下,选择 NetBeans Plug-in Modules。在 Projects 下,选择 Module Project 并单击 Next。
- 在 Name and Location 面板中,在 Project Name 中键入 AnagramPlugin。将 Project Location 更改为您计算机上的任何目录,如 c:\mymodules。选择 Standalone Module 单选按钮和 Set as Main Project 复选框。单击 Next。
- 在 Basic Module Configuration 面板中,将代码名称基础更改为 com.toy.anagrams。留出本地化包和 XML 层的位置,以便它们存储在名为 com/toy/anagrams 的包中。单击 Finish。
IDE 创建 AnagramPlugin 项目。该项目包含所有资源和项目元数据,如该项目的 Ant 构建脚本。该项目在 IDE 中打开。您可以在 Projects 窗口 (Ctrl-1) 中查看其逻辑结构,在 Files 窗口 (Ctrl-2) 中查看其文件结构。例如,现在 Projects 窗口应该如下所示:
有关以上每个文件的基本信息,请参阅 NetBeans 插件模块的快速入门指南。
重新实现 Anagram Game
接下来,您需要获得与 IDE 一起打包的 NetBeans Anagram Game。拥有它之后,您将替换它的其中一个类,代替使用 JFrame,您需要使用 JComponent。然后,在以下部分中,您将添加一个扩展 Class TopComponent 的类和一个扩展 Class CallableSystemAction 的操作。
- 选择 File > New Project (Ctrl-Shift-N)。在 Categories 下选择 Samples,然后选择 General。在 Projects 下,选择 Anagram Game 并单击 Next。接受默认值并单击 Finish。
- 展开 AnagramGame 节点及其 Source Packages 节点。使用鼠标将 com.toy.angrams.lib 包和 com.toy.angrams.ui 包拖动到 AnagramPlugin 节点的 Source Packages 节点中。现在 Projects 窗口应该显示如下:
- 展开 com.toy.anagrams.ui 包,右键单击 Anagrams.java,然后选择 Delete。单击此处下载组件版本的 Anagrams.java 并将其放置在 com.toy.anagrams.ui 包中。
Anagrams.java 的组件版本和原始版本之间的区别如下:
- 组件版本的 Anagrams.java 使用 JComponent 而不是 JFrame。
- 由于组件停靠在不支持菜单栏的模式中,因此组件版本的 Anagrams.java 没有菜单栏。
- 由于 Anagram Game 将是与 IDE 一起关闭的插件,因此,对于组件版本的 Anagrams.java 没有 exitMenuItemActionPerformed 和 exitForm。
注意,您可以使用 IDE 来区分组件版本的 Anagrams.java 和它的原始版本。要完成此操作,请重新创建 Anagram Game,选择两个 Anagrams.java 文件,右键单击,然后在上下文菜单中选择 Tools > Diff。
停靠 Anagram Game
使用 Window Component 向导
- 右键单击 AnagramPlugin 项目节点并选择 New > Window Component。单击 Next。
- 在 Basic Settings 面板中,选择 explorer 并选择 Open on Application Start。
Basic Settings 面板应该如下所示:
单击 Next。
- 在 Name and Location 面板中,键入 AnagramGame 作为 Class Name Prefix 并浏览到作为新文件类型的图标的任何 16x16 像素的图像文件,如下所示。
注意到在 NetBeans 安装目录中发现了几个 16x16 像素图像文件,例如,在以下位置:
enterprise2\jakarta-tomcat-5.5.7\server\webapps\admin\images.
对于本教程,只使用上面目录中的 Datasource.gif 图像。其形式如下:
- 单击 Finish。
现在 Projects 窗口应该显示如下:
IDE 在 com.toy.anagrams 中创建 AnagramGameTopComponent.java 并在 Source Editor 中打开它。这是您应该看到的(单击该链接可以看到相关的 NetBeans API Javadoc):
package com.toy.anagrams;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
import org.openide.util.Utilities;
import org.openide.windows.TopComponent;
/**
* Top component which displays something.
*/
final class AnagramGameTopComponent extends TopComponent {
private static final long serialVersionUID = 1L;
private static AnagramGameTopComponent instance;
private AnagramGameTopComponent() {
initComponents();
setName(NbBundle.getMessage(AnagramGameTopComponent.class, "CTL_AnagramGameTopComponent"));
setToolTipText(NbBundle.getMessage(AnagramGameTopComponent.class, "HINT_AnagramGameTopComponent"));
setIcon(Utilities.loadImage("com/toy/anagrams/Datasource.gif", true));
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
//
private void initComponents() {
setLayout(new java.awt.BorderLayout());
}
//
// Variables declaration - do not modify
// End of variables declaration
/**
* Gets default instance. Don't use directly, it reserved for '.settings' file only,
* i.e. deserialization routines, otherwise you can get non-deserialized instance.
*/
public static synchronized AnagramGameTopComponent getDefault() {
if (instance == null) {
instance = new AnagramGameTopComponent();
}
return instance;
}
public int getPersistenceType() {
return TopComponent.PERSISTENCE_ALWAYS;
}
public void componentOpened() {
// TODO add custom code on component opening
}
public void componentClosed() {
// TODO add custom code on component closing
}
/** replaces this in object stream */
public Object writeReplace() {
return new ResolvableHelper();
}
protected String preferredID() {
return "AnagramGameTopComponent";
}
final static class ResolvableHelper implements Serializable {
private static final long serialVersionUID = 1L;
public Object readResolve() {
return AnagramGameTopComponent.getDefault();
}
}
}
IDE 还创建 AnagramGameAction.java。这是用于打开该窗口的操作类(单击该链接可以看到相关的 NetBeans API Javadoc):
package com.toy.anagrams;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import org.openide.ErrorManager;
import org.openide.util.NbBundle;
import org.openide.util.Utilities;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
/**
* Action which shows AnagramGame component.
*/
public class AnagramGameAction extends AbstractAction {
public AnagramGameAction() {
putValue(NAME, NbBundle.getMessage(AnagramGameAction.class, "CTL_AnagramGameAction"));
putValue(SMALL_ICON, new ImageIcon(Utilities.loadImage("com/toy/anagrams/Datasource.gif", true)));
}
public void actionPerformed(ActionEvent evt) {
TopComponent win = WindowManager.getDefault().findTopComponent("AnagramGameTopComponent");
if (win == null) {
ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find AnagramGame component.");
return;
}
win.open();
win.requestActive();
}
}
IDE 将在 layer.xml 文件中作为菜单项和工具栏按钮注册 action 类:
<filesystem>
<folder name="Actions">
<folder name="Window">
<file name="com-toy-anagrams-AnagramGameAction.instance"/>
</folder>
</folder>
<folder name="Menu">
<folder name="Window">
<file name="AnagramGameAction.shadow">
<attr name="originalFile" stringvalue="Actions/Window/com-toy-anagrams-AnagramGameAction.instance"/>
</file>
</folder>
</folder>
<folder name="Windows2">
<folder name="Components">
<file name="AnagramGameTopComponent.settings" url="AnagramGameTopComponent.xml"/>
</folder>
<folder name="Modes">
<folder name="explorer">
<file name="AnagramGameTopComponent.wstcref" url="AnagramGameTopComponent_1.xml"/>
</folder>
</folder>
</folder>
</filesystem>
当您打开 AnagramGameTopComponent.java 时,单击 Design,将打开 Form Editor:
正常情况下您可以使用 Form Editor 来设计您的顶部组件。但在本例中,我们重新使用在本教程开始部分下载的组件版本的 Anagram.java 类。下一步将向您介绍如何执行该操作。
- 在 Source Editor 中,向 AnagramGameTopComponent.java 中添加以下方法:
protected void initAnagrams(){
new Anagrams(this);
}
然后更改构造函数以便调用新的方法:
private AnagramGameTopComponent() {
initAnagrams();
setName(NbBundle.getMessage(AnagramGameTopComponent.class, "CTL_AnagramGameTopComponent"));
setToolTipText(NbBundle.getMessage(AnagramGameTopComponent.class, "HINT_AnagramGameTopComponent"));
setIcon(Utilities.loadImage("com/toy/anagrams/Datasource.gif", true));
}
调用 initAnagrams() 的行带有下划线并标记为错误,类似于以下说明。这是因为相关的包尚未得到声明。
在 Source Editor 中,单击 Alt-Shift-F。com.toy.anagrams.ui.Anagrams 的 import 语句即被添加到该类的顶部。
插件模块到此结束。接着,您需要安装和使用它。
构建和安装模块
IDE 使用 Ant 构建脚本来构建和安装您的模块。构建脚本是创建模块项目时为您创建的。
安装 NetBeans 模块
使用模块
- 在 IDE 的菜单栏中,您将在菜单栏的右侧位置看到新的菜单和菜单项以及 myicon.gif:
- 选择该菜单项以调用 OpenAnagramAction.java 中的 performAction 方法。您将看到在“explorer”模式下嵌入的 Anagrams 示例:
创建可共享的二进制文件
- 在 Projects 窗口中,右键单击 AnagramPlugin 项目,并选择 Create NBM。
将创建 NBM 文件并且可以在 Files 窗口中查看它 (Ctrl-2):
- 通过电子邮件使其他人也可以使用。
卸载模块
- 关闭您安装模块时打开的 Platform 实例。
- 在 Projects 窗口中右键单击该项目节点,并选择 Clean。现在,您将不再有安装在该 Platform 中的模块。
下一步
有关更高级的教程,请参见以下资源:
有关创建和开发 NetBeans 插件模块的更多信息,请参见以下资源:
版本控制
|
版本
|
日期
|
更改
|
|
1
|
2005 年 6 月 30 日
|
初始版本
|
|
2
|
2005 年 7 月 7 日
|
- 添加了源代码和介绍如何下载和安装插件的介绍性部分。
- 添加了原始版本和组件版本的 Anagrams.java 文件之间的区别列表。
- 添加了关于使用 IDE 来区分原始版本和组件版本的 Anagrams.java 文件的说明。
- 更正了 Action 类所需的 import 语句的列表。
- 在 Bundle.properties 中添加了菜单和菜单项的本地化。
- 在菜单栏中显示菜单序列。
- 更改了最后两个屏幕截图以显示本地化、序列和 explorer 模式。
- 添加了新部分:“以不同的模式停靠 NetBeans 插件模块”和“创建可共享的插件二进制文件”
- 更正了对复制/粘贴错误 org.myorg.myfirstmodule 的一个错误参考。
|
|
3
|
2005 年 7 月 11 日
|
- “实现组件”部分的第一步中,在句子中添加了“AnagramPlugin”,以便用户更容易找到 com.toy.anagrams package。
- “AnagramProject”的两个实例更改为“AnagramPlugin”。
- 添加了“leftSlidingSide”和“rightSlidingSide”模式。
|
|
4
|
2005 年 9 月 30 日
|
- 由于 Window Component 向导的原因,全部进行了重新编写和彻底简化。
|
|
事件编号
|
描述
|
状态
|
|
1
|
代码和教程本身需要检查。
|
有待解决。
|
|
2
|
P1。在 New File 向导的 J2SE 示例类别中添加了有关组件版本的 anagrams.java 和原始版本之间的区别的解释。
|
有待解决。
|
|
3
|
P1。需要提供有关 topcomponent 的更多信息。模式、.wstcref 和 .settings 文件根本没有提到,需要添加。还需要解释“Serializable”。还需要添加有关“什么是模式?”、“什么是组件?”(可能还需要添加“什么是组?”)的信息。常见问题解答的链接。
|
有待解决。
|
|
4
|
P2。添加有关创建后任务部分:
- 放在不同模式中。
- 在 layer.xml 中其他位置的序列操作
|
有待解决。
|
|
5
|
P2。使用 TODO 窗口查找一些评论并添加一些代码。
|
有待解决。
|