eclipse插件开发入门及常用组件.doc

上传人:牧羊曲112 文档编号:4219615 上传时间:2023-04-10 格式:DOC 页数:48 大小:1.13MB
返回 下载 相关 举报
eclipse插件开发入门及常用组件.doc_第1页
第1页 / 共48页
eclipse插件开发入门及常用组件.doc_第2页
第2页 / 共48页
eclipse插件开发入门及常用组件.doc_第3页
第3页 / 共48页
eclipse插件开发入门及常用组件.doc_第4页
第4页 / 共48页
eclipse插件开发入门及常用组件.doc_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《eclipse插件开发入门及常用组件.doc》由会员分享,可在线阅读,更多相关《eclipse插件开发入门及常用组件.doc(48页珍藏版)》请在三一办公上搜索。

1、Eclipse插件开发入门.Eclipse最有魅力的地方就是它的插件体系结构。在这个体系中重要的概念是扩展点(extension points)。扩展点就是在软件开发过程中暴露出来的接口。每一个插件都是在现有的扩展点上开发的,并可能还留有自己的扩展点,以便在这个插件上继续开发。 简介 Eclipse 平台是IBM向开发源码社区捐赠的开发框架,它之所以出名并不是因为IBM宣称投入开发的资金总数为4 000万美元,而是因为如此巨大的投入所带来的成果:一个成熟的、精心设计的、可扩展的体系结构。Eclipse 的价值是它为创建可扩展的集成开发环境提供了一个开放源码平台。这个平台允许任何人构建与环境和其

2、他工具无缝集成的工具。工具与Eclipse无缝集成的关键是插件。除了小型的运行时内核之外,Eclipse中的所有东西都是插件。从这个角度来讲,所有功能部件都是以同等的方式创建的。 由于有了插件,Eclipse系统的核心部分在启动时要完成的工作十分简单:启动平台的基础部分和查找系统的插件。整个Eclipse体系结构就像一个大拼图,可以不断地向上加插件,同时,在现有插件上还可以再加插件。 开发“Hello,world”插件 创建插件最简单的方法是使用Eclipse中专门为开发插件而设计的插件PDE(Plug-in Development Environment)。PDE 和 Java Develo

3、pment Tooling(JDT)IDE是 Eclipse 的标准扩展。PDE 提供了一些向导可以帮助创建插件。下面的“Hello,world”插件将通过PDE进行开发。 下面是创建一个简单插件的操作步骤。 (1)运行Eclipse。 单击Eclipse的“File”“New”“Other”菜单项,在弹出的对话框中选择Select对话框左边的Plug-in Development向导。如图1所示,选择Plug-in Project。 图1 新建插件对话框 (2)单击“Next”按钮,弹出新建对话框,输入项目名称。此处使用了“com.test.helloworld”。单击“Next”按钮后弹出

4、新建对话框页,如图2所示,插件标识就与项目名称相同。使用项目名称作为插件标识可以将该插件与另一个插件的名称发生冲突的机会减到最小。 图2 新建对话框向导 (3)单击“Next”按钮,选择“Hello, world”,如图3所示。 图3 新建插件向导 (4)单击“Finish”按钮,就可以创建用户想要建立的插件。 上例中通过插件创建向导创建了“Hello,world插件”,通过Eclipse的插件创建向导还能够创建其它扩展点插件的创建。 调试“Hello,world”插件 通过PDE不但能创建插件,还能够调试插件。在Eclipse中调试插件的步骤如下。 (1)单击“Run”“Debug”菜单项。

5、 (2)在弹出的对话框窗口中用鼠标右键单击“Eclipse Application”选项。 (3)单击“New”菜单项(或双击Eclipse Application树节点),创建调试插件配置参数对话框,并通过对话框设置插件的调试参数,如图4所示。 图4 Debug环境参数设置 (4)单击“Debug”按钮。 现在已经启动了一个调试的Eclipse,可以看到图5显示的调试窗口。调试窗口多了一个“Sample Menu”菜单项,工具栏多了一个按钮,单击菜单或按钮将会弹出 “Hello,world”对话框。 图5 “Hello,world”插件效果图 用户可以在程序中可执行到的位置设置断点,就可以和

6、调试Java程序一样调试Eclipse插件了。 注意:如果在图4中选择Clear workspace data before lauching,表示每次调试插件时是否提示清空运行时刻的Workspace。可以选择“是”,表示重建运行时刻的Workspace。 插件打包 这一步是把用户开发的插件打包,供别人使用。具体步骤如下。 (1)选择“Hello,world”插件,单击鼠标右键,选择“Export”菜单,弹出图6所示的对话框。 图6 插件打包对话框 (2)输入用户想要打包的文件名。如果想把源文件也打包,可以选择“Include source code”复选框。现在“Hello,world”插

7、件就已经成功打包了。 (3)把“Hello,world”插件解压缩拷贝到用户的Eclipse的Plugins目录下面。运行Eclipse,就可以在运行环境下看到“Hello,world”插件的身影了。 通过Export 菜单对插件进行打包,实际上Eclipse会读取插件目录下的build.properties文件,通过它来描述需要打包的内容。 提示:不要把“Hello,World”插件拷贝到开发环境的Eclipse下面,否则插件可能不会被注册。因为开发环境的Workspace中有相同ID的插件,这样会产生冲突。要养成好习惯,把开发环境和部署环境分开。 插件描述文件 Eclipse中插件的描术文

8、件包括Plugin.xml文件和MANIFEST.MF: l Plugin.xml:Plugin.xml描述了扩展点的基本信息,包括扩展点的实现和定义,它按照扩展点的定义文件(schema)描述扩展的信息。 l MANIFEST.MF:MANIFEST.MF记录了插件的状态信息,包括插件的依赖关系、运行时的类加载路径以及插件的名称等。 Plugin.xml主要是通过XML文件格式描述扩展点的具体内容。当Eclipse启动后,它将会找到所有插件的描述文件。当Eclipse第一次启动某一个插件时,它会从MANIFEST.MF文件读取插件的相关信息,并通过定义的插件类初始化插件。 插件描述文件编辑器

9、窗口,如图7所示。 图7 清单文件编辑窗口 Manifest.MF文件中保存了插件的基本信息(和OSGI相关的信息),而Plugin.xml文件记录了扩展点的信息,这两个文件在一个编辑器中展现,分成如下几个部分。 l Overview:描述了插件的基本信息。 l Dependencies:描述了插件的依赖关系。 l Runtime:指明运行时的ClassPath。 l Extensions:指明插件实现的扩展点。 l Extension Points:指明插件提供的扩展点。 1. OverView:描述了插件的基本信息 OverView描述了插件的基本信息,如图8所示。 图8 OverView

10、页面 l ID:ID是插件的ID号,在Eclipse中是一个具体标识。 l Version:Version指明用户所开发的插件的版本号。 l Name:指用户所开发的插件的名称。 l Provider:开发者。 l Class:Class是指插件类,它由Eclipse建立并初始化,后面的章节将会详细介绍。 l Platform. Filter:指定平台相关的一些信息,一般来说用户不需要设定。 提示:ID号在Eclipse中是一个全局的标识。很多初学者常常会对不同的插件命名成相同的ID号,这样会导致插件不能加载。 2. Dependencies:描述了插件的依赖关系 Dependencies页面

11、描述了插件的依赖关系,如图9所示,插件依赖org.eclipse.ui和org.eclipse.core.runtime插件。 图9 Dependencies页面 Dependencies是一个比较重要的概念。每一个插件有独立的ClassPath,Dependencies会把依赖的插件的ClassPath加入到当前的ClassPath中。 提示:插件可以调用依赖的插件中所有导出的类,但插件不能够有循环依赖,所以在设计插件的结构时一定要设计合理,切记、切记。 3. Runtime:指明了运行时的ClassPath Runtime:指明了运行时的ClassPath。如图10所示,jdom.jar为

12、此插件运行时依赖的包。 图10 Runtime页面 在Exported packages中也加入了一些要导出的包,如果不导出这些包,其它依赖当前插件的插件就用不了当前插件中对应包下的类。 Runtime也是一个比较重要的概念,它指明了运行时的环境。Eclipse中插件不会引用到系统的ClassPath,每一个插件都有独立的ClassPath。 提示:很多人在开发插件时,没有通过Runtime指明ClassPath,而是直接添加Jar包,这样,在编译期间可能不会出错,但是在插件运行时会提示类找不到(ClassNotFoundException),就是这个问题。 4. Extensions:指明插

13、件实现的扩展点 Extensions:指明插件实现的扩展点。例如插件要实现“org.eclipse.ui.actionSets”扩展点,如图11所示。 图11 Extensions页面 Extensions是用户在开发一个插件中用到的扩展点,也是Eclipse开发的精髓所在。后面章节的主要工作就是围绕扩展点展开的。下面为扩展点在Plugin.xml文件中定义的片段。 action label=&Sample Action icon=icons/sample.gif class=com.test.helloworld.actions.SampleAction tooltip=Hello,

14、 Eclipse world menubarPath=sampleMenu/sampleGroup toolbarPath=sampleGroup id=com.test.helloworld.actions.SampleAction 5. Extension Points:指明了用户插件提供的扩展点 Extension Points:指明了用户插件提供的扩展点。如图12所示,此处为UI插件所提供的扩展点。 图12 插件提供扩展点 Eclipse的强大功能就是提供插件的扩展机制,用户可以实现他人提供的扩展点,也可以通过“Extension Points”为他人提供扩展点。 提示:实现扩展点和提

15、供的扩展点是两个不同的概念。实现扩展点是利用其他插件提供的扩展点,实现用户想要完成的功能。提供的扩展点是为其他插件提供扩展所需要的接口。 视图插件视图是工作台页面内的可视组件,通常用来浏览信息的层次结构(如工作空间)、打开编辑器或显示活动编辑器的属性。用户可以通过“Window”“Show view”菜单显示视图,也可以从视图局部标题栏关闭视图。视图分类 在Eclipse中用户可以在同一时间打开多个视图(编辑器在同一时间只能打开一个),每个视图能够有自己的位置布局信息,Eclipse会根据上一次视图布局的信息初始化视图。 Eclipse视图一般来说有两种表现形式,一种是用户通过视图扩展点“or

16、g.eclipse.ui.views”实现自定义的视图,另一种是实现Eclipse中视图提供的扩展,用户可以通过实现Eclipse的相应接口实现,如Outline视图和Properties视图,如图1所示。 图1 Eclipse视图 在Eclipse中,用户可以按自己的要求建立自己的视图,即扩展Eclipse的视图扩展点。也能实现Eclipse的接口,通过Eclipse的Adapter机制实现Eclipse的扩展。其中,Outline和Properties视图也是通过这种方式实现的,在后面的章节会介绍Outline视图和Properties视图的实现。 当用户定义了自己的视图后能通过“Wind

17、ow”“Show view”菜单打开自定义的视图。如图2所示。 图2 选择视图 常用视图可实现的功能 Eclipse的视图就功能来说一般有两种形式,一种是功能性视图,例如Java的Default视图,default负责用树形目录组织Java的项目结构,并且能通过双击节点在编辑器中打开相应的资源。另一种视图是辅助型的视图,例如Console负责控制台信息的显示。 不管是哪种类型的视图,它们的实现原理是一样的。在Eclipse中视图可以实现的功能有如下一些。 l 右键菜单:可以通过视图中的树、表弹出的菜单完成相应的功能。 l 工具栏:可以定制视图的工具栏,完成当前视图的功能。 l 表格:视图中可以

18、加入表格以显示相应的表结构信息。 l 树:视图中可以加入树结构以显示相应的树结构信息。 l Log 输出:视图中可以直接输出信息。 这些只是一般在Eclipse中可以看到的实现,用户可以把视图当做操作Eclipse接口。 提示:任何SWT的组件都可以作为视图的一部分,用户可以按自己的需求定制自己的视图。 创建“Tree viewer”视图 创建“Tree viewer”视图插件项目,步骤如下: 1. 打开新建向导。 单击Eclipse的“File”“New”“Other”菜单项,在弹出的对话框中选择Select对话框左边的 Plug-in Development 向导。 2. 建立一个空的插件

19、项目。 l 输入插件工程的名字为“com.free.view. treeview”。 l 输入插件的ID为“com.free.view.treeview”。 l 输入插件的Name为“helloworld Plug-in”。 l 选择使用模板建立插件项目,如图3所示。 l 单击“Next”按钮,选择“Tree viewer”选项。 l 单击“Finish”按钮,完成项目的建立。 图3 选择插件模板对话框 通过这种方式建立了一个包含JFace的“Tree viewer”组件的插件项目,此项目已经具备了视图插件常用的功能。 视图扩展点 通过插件模板创建了“Tree viewer”视图插件,此插件只

20、实现了一个视图分类节点和视图节点。如例程1所示。 例程1 plugin.xml “plugin.xml”实现了视图的扩展点“org.eclipse.ui.views”,Eclipse会根据扩展点的信息展现视图。 视图扩展点的实现类 在“Tree viewer”视图中要完成的功能有:树、菜单、工具栏和事件响应事件。“Tree viewer”视图的实现类为“TreeViewTest”,通过实现类能实现这些功能。 实现类中要完成如下的功能。 1. 初始化树。 2. 完成菜单和工具栏响应的Action。 3. 完成上下文菜单。 4. 完成工具栏。 5. 完成双击树节点的响应方式。 在createPar

21、tControl方法中能对视图进行初始化,代码片段如下。 public void createPartControl(Composite parent) /初始化树 viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); drillDownAdapter = new DrillDownAdapter(viewer); viewer.setContentProvider(new ViewContentProvider(); viewer.setLabelProvider(new ViewLabelProv

22、ider(); viewer.setSorter(new NameSorter(); viewer.setInput(getViewSite(); /完成菜单和工具栏响应的Action makeActions(); /完成上下文菜单 hookContextMenu(); /完成双击树节点的响应方式 hookDoubleClickAction(); /完成工具栏 contributeToActionBars(); 通过实现类,用户能加入自己感兴趣的功能。“Tree viewer”视图中实现类的完整代码如例程2所示。 例程2 TreeViewTest.java public class TreeV

23、iewTest extends ViewPart private TreeViewer viewer; private DrillDownAdapter drillDownAdapter; private Action action1; private Action action2; private Action doubleClickAction; /创建树节点 class TreeObject implements IAdaptable private String name; private TreeParent parent; public TreeObject(String name

24、) this.name = name; public String getName() return name; public void setParent(TreeParent parent) this.parent = parent; public TreeParent getParent() return parent; public String toString() return getName(); public Object getAdapter(Class key) return null; class TreeParent extends TreeObject private

25、 ArrayList children; public TreeParent(String name) super(name); children = new ArrayList(); public void addChild(TreeObject child) children.add(child); child.setParent(this); public void removeChild(TreeObject child) children.remove(child); child.setParent(null); public TreeObject getChildren() ret

26、urn (TreeObject )children.toArray(new TreeObjectchildren.size(); public boolean hasChildren() return children.size()0; /实现内容提供器 class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider private TreeParent invisibleRoot; public void inputChanged(Viewer v, Object oldInput,

27、Object newInput) public void dispose() public Object getElements(Object parent) if (parent.equals(getViewSite() if (invisibleRoot=null) initialize(); return getChildren(invisibleRoot); return getChildren(parent); public Object getParent(Object child) if (child instanceof TreeObject) return (TreeObje

28、ct)child).getParent(); return null; public Object getChildren(Object parent) if (parent instanceof TreeParent) return (TreeParent)parent).getChildren(); return new Object0; public boolean hasChildren(Object parent) if (parent instanceof TreeParent) return (TreeParent)parent).hasChildren(); return fa

29、lse; /初始化树节点 private void initialize() TreeObject to1 = new TreeObject(Leaf 1); TreeObject to2 = new TreeObject(Leaf 2); TreeObject to3 = new TreeObject(Leaf 3); TreeParent p1 = new TreeParent(Parent 1); p1.addChild(to1); p1.addChild(to2); p1.addChild(to3); TreeObject to4 = new TreeObject(Leaf 4); T

30、reeParent p2 = new TreeParent(Parent 2); p2.addChild(to4); TreeParent root = new TreeParent(Root); root.addChild(p1); root.addChild(p2); invisibleRoot = new TreeParent(); invisibleRoot.addChild(root); /实现标签提供器 class ViewLabelProvider extends LabelProvider public String getText(Object obj) return obj

31、.toString(); public Image getImage(Object obj) String imageKey = ISharedImages.IMG_OBJ_ELEMENT; if (obj instanceof TreeParent) imageKey = ISharedImages.IMG_OBJ_FOLDER; return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey); class NameSorter extends ViewerSorter public TreeViewTest() p

32、ublic void createPartControl(Composite parent) viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); drillDownAdapter = new DrillDownAdapter(viewer); viewer.setContentProvider(new ViewContentProvider(); viewer.setLabelProvider(new ViewLabelProvider(); viewer.setSorter(new NameSor

33、ter(); viewer.setInput(getViewSite(); makeActions(); hookContextMenu(); hookDoubleClickAction(); contributeToActionBars(); /提供右键菜单 private void hookContextMenu() MenuManager menuMgr = new MenuManager(#PopupMenu); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() public

34、 void menuAboutToShow(IMenuManager manager) TreeViewTest.this.fillContextMenu(manager); ); Menu menu = menuMgr.createContextMenu(viewer.getControl(); viewer.getControl().setMenu(menu); getSite().registerContextMenu(menuMgr, viewer); /提供视图工具栏 private void contributeToActionBars() IActionBars bars = g

35、etViewSite().getActionBars(); fillLocalPullDown(bars.getMenuManager(); fillLocalToolBar(bars.getToolBarManager(); private void fillLocalPullDown(IMenuManager manager) manager.add(action1); manager.add(new Separator(); manager.add(action2); /填充菜单 private void fillContextMenu(IMenuManager manager) man

36、ager.add(action1); manager.add(action2); manager.add(new Separator(); drillDownAdapter.addNavigationActions(manager); / Other plug-ins can contribute there actions here manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS); private void fillLocalToolBar(IToolBarManager manager) manager.a

37、dd(action1); manager.add(action2); manager.add(new Separator(); drillDownAdapter.addNavigationActions(manager); /创建菜单和工具栏对应的Action private void makeActions() action1 = new Action() public void run() showMessage(Action 1 executed); ; action1.setText(Action 1); action1.setToolTipText(Action 1 tooltip)

38、; action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages(). getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK); action2 = new Action() public void run() showMessage(Action 2 executed); ; action2.setText(Action 2); action2.setToolTipText(Action 2 tooltip); action2.setImageDescriptor(Pl

39、atformUI.getWorkbench().getSharedImages(). getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK); doubleClickAction = new Action() public void run() ISelection selection = viewer.getSelection(); Object bj = (IStructuredSelection)selection).getFirstElement(); showMessage(Double-click detected on +obj.t

40、oString(); ; private void hookDoubleClickAction() viewer.addDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) doubleClickAction.run(); ); private void showMessage(String message) MessageDialog.openInformation( viewer.getControl().getShell(), Tree View, me

41、ssage); /响应获得焦点 public void setFocus() viewer.getControl().setFocus(); 上例中通过内容提供器(ViewContentProvider)、标签提供器(ViewLabelProvider)及树节点(TreeObject)的定义提供了树的实现,另外通过createPartControl方法实现了相应的菜单和工具栏。 提示:本例中右键菜单和工具栏的实现方式非常值得效仿,而且非常直观,读者可以比较一下在SWT中的实现方式,找到它们之间的异同点。 运行“Tree viewer”视图 “Tree viewer”插件到此就已经完成,现在可以

42、调试插件了。 1. 运行插件。 2. 打开运行时工作台的“Show View”。 在“Show View”窗口中可以看到前面建立的分类和视图节点。 3. 运行“Tree viewer”视图 双击“Tree View”节点,打开视图窗口,如图4所示。 图4 “Tree viewer”视图 在Eclipse插件的开发中,视图插件的开发是比较重要的一个部分。视图是工作台页面内的可视组件,用户可以通过视图,扩展Eclipse原有的功能。插件开发时常用的组件在SWT的开发过程中,用户会经常使用到打印对话框、颜色对话框、字体对话框、文件对话框和目录对话框等对话框等,在些将简单介绍这些对话框的使用。颜色对话框(ColorDialog) 当用户要改变颜色的设置,就要用到颜色对话框,如图1所示。 图1 颜色对话框 用户可以通过如下代码片段新建颜色对话框,并设置标签的颜色。 /新建颜色对话框 ColorDialog dlg = new ColorDialog(shell); /设置默认的颜色 dlg.setRGB(colorLabel.getBackground().getRGB(); /设置标题字体 dlg.setText(Choose

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号