Java Solaris 加入 SDN 参与讨论 我的社区 注册说明
 
 
 
 
 
 
Java API 文档中文版
图片浏览器
 
By Kunal Modi, 2/20/08  

简介

长期以来,我一直使用 NetBeans 编写代码。今天,我将展示一个小型的 MyPictures 模块(适用于 Windows)。对于总是需要打开 NetBeans 窗口的用户,在我的文档(MyDocuments)中打开另一个图片资源管理器并查看我的图片文件夹(MyPictures Folder)成了一件繁琐的事情。一个短小而简单的代码可以为您提供巨大的帮助。使用 PicturesExplorer 在 NetBeans 内部查看我的图片( MyPictures )文件夹怎么样? 噢,那就是我的整个构思。将 NetBeans TopComponent、 ExplorerAPI、FileSystemsAPI 与其他 API 一起使用,这种方案极有可能。

前期准备

需求:NetBeans6.0,可以从 netbeans.org 免费下载

在NetBeans IDE中开发模块的一些想法。

  • 在本例中,我们将在 Windows 的我的图片( My Pictures )文件夹中创建一个简单的 PicturesExplorer 模块来欣赏图片。

创建模块

  • 要建立新模块,打开 File--> New Project
  • 从 category(类别)中选择 NetBeans Modules 并从旁边的 Projects 窗口中选择 Module。
  • 单击 Next 按钮。
创建新模块
  • 设置项目名称为 “PicturesExplorer”并设置目标项目文件夹及其位置。
  • 使它成为一个独立的模块。单击 Next 按钮。
  • 将代码基(Code Name Base)重新命名为“org.modules.sack.picturesexplorer” 并保留其他默认设置。
  • 单击 Finish 按钮。

之后,新模块在项目窗口出现,其源包为“org.modules.sack.picturesexplorer”。

创建一个新的 TopComponent

为了在导航窗口中显示该文件。因此我们制作一个新的 TopComponent。

  • 右键单击 package folder (包文件夹),选择新的 Window Component。
  • 选择 Window 位置作为 Navigator(导航)。(在导航窗口中将打开一个新的资源管理器。其他选项对应其他可能的 TopComponent )
  • 保持 “Open on Application Start” 选项为取消选中。单击 next 按钮。
  • 将 ClassPrefix 设置为“Pictures”。
  • 设置一个图标。图标应该是 16X16 .png 、16X16 .gif 文件。
  • 单击 Finish 按钮。

设计用户界面( UI )

创建了 TopComponent。现在我们需要为 “PicturesTopComponent.java” 设计用户界面(UI)

切换到 “PicturesTopComponent.java”设计器表单

在 Component Inspector 中,右键单击 TopComponent 节点,然后选择 Set Layout > BorderLayout。

  • 从 Component Palette 窗口选择 JScrollPane,在表单上下拉滚动窗格以至于窗格覆盖整个表单。(这里的秘密在于,所有的资源管理器用户界面(Explorer UI)组件都是 JScrollPane 的子类 —— 因此您可以简单地改变实例代码来创建一个资源管理器视图。参考资料 :—— NetBeans 选择管理教程 II— 使用节点
  • 选择 JScrollPane,并选择属性表。单击代码选项卡并编辑 “Custom Creation Code”。设置该字段为 new BeanTreeView()"。(BeanTreeView 和许多其他组件由 Explorer API 提供用来表示 Nodes (节点))。

代码内容

  • 现在切换到代码编辑器。
  • 现在我们需要表示资源管理器内容。为了显示节点,我们需要具备一个 ExplorerManager。是凡表示 Node (节点)都与 ExplorerManager (而不是组件)相关。让我们组装一个 ExplorerManager。在 “PicturesTopComponent.java” 中包括下列代码行。
  • ExplorerManager mgr = new ExplorerManager();
  • 我们还需要将 ExplorerManager.Provider 界面推行到 PicturesTopComponent.java 中。
    • 迄今为止各行中一定附带了许多错误注释。
    • 别担心,这是因为还没有找到适当的依赖关系。让我们逐个添加依赖性( Dependencies )。
    • 右键单击项目节点然后选择属性。进入库节点并单击 add 按钮。
    • 弹出一个窗口。让我们查找第一个依赖性。键入 “ExplorerManager”。

结果显示 org.openide.explorer.ExplorerManager 类。并单击 OK 按钮。Explorer 和 PropertySheet Module 添加了依赖性。

    • 用类似方法查找 BeanTreeView,您会发现同样的依赖性模块。
    • 单击 ok 按钮,退出属性表。
    • 每个先前错误注释行旁边的灯泡发光显示用来导入适当类的一个选项。否则,按住 Ctrl+Shft+I 也会自动导入类。
    • 在类的页眉注释处的灯泡发光,要求实施 ExplorerManager.Provider 的抽象方法,单击并实施该方法。将 getExplorerManager() 方法的主体部分替换为
return mgr;

只要该代码被调用,它就会返回与组件相关的 ExplorerManager。

  • 如果您现在运行模块(右键单击项目节点并选择在目标平台中安装),您就可以在 Windows 菜单中看到 “Pictures”选项。单击 “Pictures”。使用未命名节点在导航窗口中打开“Pictures Window”。

现在我们的视图准备就绪,我们需要为我们的图片文件提供节点。为此,我们必须使用 componentOpened() 和 componentClosed()。

使用 FileObjects

  • 在 NetBeans 中,一个 FileObject 表示一个文件/ 文件夹。现在我们需要将 FileObject 映射到所需的文件夹。例如,该插件显示驻留在 Windows 的我的图片(My Pictures)文件夹中的图片。因此我们需要得到一个表示我的图片(My Pictures)的逻辑连接。使用功能强大的 org.openide.filesystems.FileUtil 就可简单完成这项操作。
FileObject root = 
FileUtil.toFileObject(new File("C:/Documents and Settings/"+
getUsername()+"/My Documents/My Pictures"));
  • 上述代码将 java.io.File 映射到 org.openide.filesystems.FileObject 并将它分配到根中。您可能注意到 getUsername() 方法了。稍后我们就会讨论。
if(root != null){ 
try{
dataObject = DataObject.find(root);
rootnode = dataObject.getNodeDelegate();
mgr.setRootContext(rootnode);
}
catch(DataObjectNotFoundException ex){
ex.printStackTrace();
}
}
  • 如果已经确立一个成功的路径,根会对应到一个 FileObject。使用它我们需要找到 DataObject,以便当需要时加载器从指定路径加载数据。所有剩余的将用于表示前面制作的 BeanTreeView 代表性视图。要完成这一步,我们需要请求 dataObject 获得 NodeDelegate。getNodeDelegate()Node 返回一个先前实例化值。如果以前没有显示,需要创建一个(仔细阅读 getNodeDelegate )。如果 dataObject 返回一个空值,DataObjectNotFoundException 被激活。
  • 使用 ExplorerManager,mgr,为 BeanTreeView 获得的 Node (节点)设置 Root (根)节点。
  • 现在我们使用 setData() 方法封装该代码,例如:
void setData(){ 
root = FileUtil.toFileObject(new File("C:/Documents and Settings/"
+getUsername()+"/My Documents/My Pictures"));
if(root != null){
try{
dataObject = DataObject.find(root);
rootnode = dataObject.getNodeDelegate();
mgr.setRootContext(rootnode);
}
catch(DataObjectNotFoundException ex){
ex.printStackTrace();
}
}
}
  • 组件 Opened() sh应该调用 setData() 也就是,
public void componentOpened() { 
setData();
}
  • 因为 root、rootnode、dataObject 还没有定义,所以可能还有少量错误注释。在类( Class )级变量定义它们。
  • 在我们开始之前添加另一种方法 getUsername()。
public String getUsername(){ 
username = java.lang.System.getProperty("user.name");
return username;
}
  • 再次在类( Class )级上定义用户名(username)字符串( String )变量。该定义将从用户获得用户名。
  • 添加 Dependencies Node API、FileSystem API、 DataSystems API 并整理所有导入内容。

导入

最终的导入内容列表应如下所示:

import java.io.File; 
import java.io.Serializable;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import org.openide.explorer.ExplorerManager;
import org.openide.explorer.view.BeanTreeView;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObject;
import org.openide.loaders.DataObjectNotFoundException;
import org.openide.nodes.Node;
import org.openide.util.NbBundle;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
import org.openide.util.Utilities;

所有要构建的集合

  • 选择项目节点,单击鼠标右键并选择 clean and build。
  • 运行模块。
  • 查看 Windows 菜单并选择 Pictures。
  • 您可以从 MyPictures 文件夹中看到所有图片列表。
  • 在 Editor(编辑器)区域内双击以便打开图片。
  • 您可以从模块的弹出菜单中选择 “Create NBM”来制作一个可以在 NetBeans 中安装的 .nbm 文件。现在您可以在 project(项目)的 build (构建)文件夹中找到 .nbm 文件。

未来之路

  • 脑海中突然浮现出一个心仪的 NetBeans 插件列表。这可不是一天的功夫就能完成的工作。代码问题比较乐观。
  • 我现在正从事这方面工作,通过图片向其他文件类型提供支持和更好的浏览功能。
  • 我还在研究能够将所有图片扫描到 NetBeans 图片资源管理器( NetBeans Picture Explorer )的方式。

建议

  • 这是我的第一篇教程。欢迎提出准确性和改进方面的建议。

参考资料