服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

eclipse插件开发之添加简单的gui元素

编写eclipse插件的方法很简单,你只需要编写一个应用程序,并把它"添加"到eclipse上。但是与编写音乐类似,在能够创作一部著作之前,首先必须学习大量的相关知识。

本文将讨论少许几个简单的gui元素:

? 工具条按钮

? 菜单项

? 对话框

为了使用这些元素,我们将稍微修改已有的插件,顺便编写一个可供使用的工具类。

扩展点(extension points)

我们不能随意地向eclipse用户界面的任何地方添加窗口小部件,只能在特殊的、指定的、有记载的位置添加。这些位置被称为扩展点(extension points)。在基本的eclipse安装中存在数以百计可供使用的扩展点。插件自身也可以发布新的扩展点。我们来看一看列表中的扩展点。打开invokatron项目(见天极网《eclipse插件开发快速入门》)中的plugin.xml文件,进入"扩展"(extensions)属性页。"所有扩展"树列出了插件的不同的窗口部件,根据它们出现时所在的扩展点来分类。例如invokatron编辑器位于编辑器(org.eclipse.ui.editor)扩展点中。图1显示了这个属性页。

eclipse插件开发之添加简单的gui元素

图1:扩展页

现在请点击"添加"(add)按钮,出现了图2所示的列表。

eclipse插件开发之添加简单的gui元素

图2:新增扩展向导,扩展列表

上下滚动这个列表可以看到很多可供使用的扩展点。你可能注意到了有两种类型的扩展点:带有扩展模板的(用加号标识)和不带扩展模板的。大多数经常用到的扩展点都带有用于辅助开发扩展的模板。图2中选择的扩展点action set,带有一个叫做"hello world"操作集的模板。当你选择某个模板的时候,会出现简短的描述。"下一个"页面将询问模板使用的参数。

现在请关闭向导并返回到"扩展"属性页。选择"invokatron编辑器"。在这个属性页中,你可能注意到了我们在向导中为invokatron编辑器输入的信息。正常的扩展需要一个唯一的标识符(id字段)、一个供显示的名称(name字段)和它所属的扩展点(point字段)。从模板中建立的扩展(例如invokatron编辑器)需要更多的参数。没有模板的扩展点也需要更多的信息,但是这些信息只能在文本编辑器中输入。

添加工具条按钮

现在我们已经了解了扩展点是什么,让我们来添加一个扩展吧。我们首先添加的是一个工具条按钮。这个按钮将调用我们前面建立的新的invokatron向导。

添加工具条按钮有三个步骤:

1.声明一个新扩展。

2.用特定的标记来扩充该声明。

3.编写操作委托类

1.声明一个新扩展

我们已经知道怎样实现这个步骤了。简单地返回到扩展点下的plugin.xml编辑器。点击"添加"。工具条按钮在org.eclipse.ui.actionsets扩展点下面。不要使用模板,直接点击"完成"。输入下面一些内容:

? id: newinvokatronaction

? name: new invokatron document action

? point: (使用默认值:org.eclipse.ui.actionsets)

返回plugin.xml属性页,eclipse给这个文件添加了新的代码片断。

2.用特定的标记来扩充该声明

这个新扩展几乎毫无内容。我们在下面添加一些标记(tag)。你知道可以使用哪些标记吗?你可以右键点击"所有扩展"树中的元素,选择"新增"菜单,会得到一个列表。你也可以查看eclipse文档。

现在我们看到自己可以在<extension>标记内部添加一个<actionset>标记。它可以包含零个或多个<menu>标记,后面跟着零个或多个<action>标记,还可以选择使用<description>标记。但是其中最重要的标记是<action>。它可以同时描述工具条按钮和菜单项。>br>下面是我们将添加的工具条按钮的xml代码片断。其中的新代码是黑体的。我们在后面会剖析这段代码。

<extension id="newinvokatronaction"

name="new invokatron document action"

point="org.eclipse.ui.actionsets">

<actionset id="invokatron.actionset"

label="invokatron actions"

visible="true">

<action id="invokatron.wizard.runwizardaction"

toolbarpath="org.eclipse.ui.workbench.file/new.ext"

icon="http://www.itus.cnicons/invokatronicon16.gif"

tooltip="starts the new invokatron document wizard."

class="invokatron.wizard.runwizardaction">

</action>

</actionset>

</extension>

所有这些操作都可以在plugin.xml编辑器中用图形化的方式来完成,但是我们查看xml以明确字段的完整文本内容。此处的<actionset>标记只含有一个操作(action)。操作表现为菜单中的项或工具条中的按钮的对象。操作的属性实在太多了,你可以在在线文档中查阅。其中最有趣的一些属性是:

? id:操作的唯一标识符。可以用于在运行时引用操作。

? toolbarpath:放置工具条按钮的位置。

? icon:工具条按钮或菜单项左侧显示的图标。它是一个与开发目录关联的16×16的gif文件。请把 图片存放到invokatron/icons文件夹中。这个文件夹已经被包含到二进制建立路径中,因此该图标将放入插件的文档目录中。

? tooltip:当鼠标停留在工具条按钮上的时候出现的文本内容。

? class:这些操作的完整的合格的类名称。
关于工具条路径

工具条路径(toolbar path)指出了添加工具条按钮的位置。由于任何人都可以建立工具条,而且有时候一个按钮可以包含子选项,因此我们用分层的标识符列表来访问这个位置。下面是经常用到的工具条列表和它们的路径:

? 文件: org.eclipse.ui.workbench.file 带有一些公共的分组标志(你可以添加按钮的更多的位置):

o "新建"区:new.ext

o "保存"区:save.ext

o "打印"区:print.ext

o "建立"区:build.ext

? 导航: org.eclipse.ui.workbench.navigate

? 载入: org.eclipse.debug.ui.launchactionset

? 编辑器表示:org.eclipse.ui.edit.text.actionset.presentation

? 搜索: org.eclipse.search.searchactionset

? java元素建立:org.eclipse.jdt.ui.javaelementcreationactionset

? 组: team

? cvs: cvs

如果你提供的工具条id不带有标志id,你的按钮就会被添加到紧挨着这个工具条的一个新工具条之上。接着这个新工具条就可以被添加到eclipse gui上了。有时候你会看到使用工具条路径"正常的(normal)"的插件。这是旧的名称转换。在eclipse 3中这样使用的时候会建立一个叫作"normal"的新工具条。如果你建立一个新工具条id,你的工具条会被添加到"文件"工具条后面。

请注意"文件"工具条的"新建"组标志。这是我们添加自己的按钮的地方。由于标志id是new.ext,完整的路径就是:

org.eclipse.ui.workbench.file/new.ext

3.编写操作委托类

最后一步是编写少量的用于实现操作的java。这个类称为操作委托。

package invokatron.wizard;

public class runwizardaction extends action

implements iworkbenchwindowactiondelegate {

/** 操作被建立的时候调用*/

public void init(iworkbenchwindow window) {}

/** 操作被删除的时候调用*/

public void dispose() {}

/** 操作被执行的时候调用 */

public void run(iaction action) {

invokatronwizard wizard= new invokatronwizard();

shell shell = platformui.getworkbench().getactiveworkbenchwindow().getshell();

wizarddialog dialog= new wizarddialog(shell, wizard);

dialog.create();

dialog.open();

}

/** 编辑器中的对象被选中或取消选择的时候调用*/

public void selectionchanged(iaction action, iselection selection) {}

}

添加菜单项

你也许猜到了添加菜单项与添加工具条按钮的过程几乎相同。你也必须声明一个扩展(同种类型的)、用特定的标记(相同的标记)来扩充它,并编写操作类(相同的类)。其主要的不同点是扩展的声明。下面是菜单项的扩展xml代码(没有相应的工具条按钮):

<extension id="newinvokatronaction"

name="new invokatron document action"

point="org.eclipse.ui.actionsets">

<actionset id="invokatron.actionset"

label="invokatron actions"

visible="true">

<action id="invokatron.wizard.runwizardaction"

label="new invokatron"

menubarpath="file/new.ext"

icon="http://www.itus.cnicons/invokatronicon16.gif"

tooltip="starts the new invokatron document wizard."

class="invokatron.wizard.runwizardaction">

</action>

</actionset>

</extension>

标签(label)属性包含了显示在菜单项上的文本内容。键盘快捷键用"&"符号表示,在xml中是&。下面是一个组合了菜单项和工具条按钮的例子:

<extension id="newinvokatronaction"

name="new invokatron document action"

point="org.eclipse.ui.actionsets">

<actionset id="invokatron.actionset"

label="invokatron actions"

visible="true">

<action id="invokatron.wizard.runwizardaction"

label="new invokatron"

menubarpath="file/new.ext"

toolbarpath="org.eclipse.ui.workbench.file/new.ext"

icon="http://www.itus.cnicons/invokatronpicture.gif"

tooltip="starts the new invokatron document wizard."

class="invokatron.wizard.runwizardaction">

</action>

</actionset>

</extension>

菜单与工具条只有稍微的不同。工具条只有一个"层次",而菜单有完整的层次。这也是用操作来声明菜单这种方法可行的原因。菜单都列举在<actionset>标记之中,在<action>标记之上。它们的语法如下:

<menu id="unique.id"

<!-- new menu at the top-level. the menubarpath

for actions inside this menu is: special -->

path="special"

label="this is a parent menu item.">

<!-- optional, the menubarpath for actions after

this separator is: special/belowbar -->

<separator name="belowbar">

</menu>
关于菜单条路径

菜单条路径(menubar path)指出了添加菜单项的位置。我们使用分层的标识符列表来访问这个位置。下面是经常使用的菜单条列表以及它们的路径和公共组标志:

? 文件:file

o "开始" 区:filestart

o "新建"菜单内部的"附加"组标志: new/additions

o "新建"区,在"新建"菜单下面:new.ext

o "关闭" 区:close.ext

o "保存" 区:save.ext

o "打印" 区:print.ext

o "打开" 区:open.ext

o "导入" 区:import.ext

o "附加" 区:additions

o "最近的文档" 区:mru

o "结束" 区:fileend

? 编辑: edit

o "开始" 区:editstart

o "撤销" 区:undo.ext

o "剪切" 区:cut.ext

o "查找" 区:find.ext

o "添加" 区:add.ext

o "结束" 区(有时不是结束):fileend

o "附加" 区:additions

? 源: org.eclipse.jdt.ui.source.menu

? 重构: org.eclipse.jdt.ui.refactoring.menu

? 导航: navigate

o "开始"区:navstart

o "go to"菜单中的"附加"组标志: goto/additions

o "打开"区(有四个):open.ext, open.ext2, open.ext3, and open.ext4

o "显示"区(有四个):show.ext, show.ext2, show.ext3, and show.ext4

o "附加"区:additions

o "结束"区:navend

? 搜索: org.eclipse.search.menu

? 项目: project

o "开始"区:projstart

o "打开"区:open.ext

o "建立"区:build.ext

o "附加"区:additions

o "结束"区:projend

? 载入: launch

? 运行: org.eclipse.ui.run

? "附加"组标志:additions

? 窗口: window

o "附加"区:additions

o "结束"区:additionsend

? 帮助: help

o "开始"区:helpstart

o "主要组"区:group.main.ext

o "教程组"区:group.tutorials

o "工具组"区:group.tools

o "更新组"区:group.updates

o "结束"区(有时候不是结束): helpend

o "附加"区:additions

o "关于组"区:group.about.ext

如果你提供的菜单条id不带有标志id,那么你的菜单项将出现在这个菜单条的后面。如果你建立了一个新菜单条id,你的菜单条就被添加到"项目"和"运行"菜单之间。

eclipse开发者提示:请让工具条和菜单条id、标志位置保持一致性。

请注意"文件"菜单的"新建"组标志。这是我们添加自己的菜单的位置。由于它的标志id是new.ext,所以完整的路径是:file/new.ext

结果

操作集合中还有其它一些特性可供使用,包括快捷键、状态按钮、浮动图标、帮助内容和窗体工具条等等。操作集合只是记载的数十个扩展点中的一种类型的扩展。因此我们看到的只是冰山一角。但是至少它使我们理解了扩展点是如何工作的。我们看到的这些过程都是很好的。

在讲解向导自定义之前,我们看一下图3所显示的新工具条按钮和菜单项:

eclipse插件开发之添加简单的gui元素

图3:新的菜单项和工具条按钮
标准对话框

eclipse提供了所有的标准对话框和建立自定义对话框的简单途径。大多数标准对话框都是由org.eclipse.jface.dialogs.messagedialog类提供的。这个类含有很多用于建立标准对话框的静态方法。下面表格列举了我们可以使用的标准对话框。

对话框类型 创建方法与swing中那些方法功能相同
确认(消息、询问图标、确认和取消按钮)messagedialog.openconfirm( shell parent, string title, string message) ,用户点击"确认"就返回true,否则返回false。joptionpane.showconfirmdialog(...) passing the optiontype joptionpane.ok_cancel_option
错误(消息、错误图标和确认按钮)messagedialog.openerror( shell parent, string title, string message)joptionpane.showmessagedialog(...) passing the messagetype joptionpane.error_message
提示(消息、提示图标和确认按钮)messagedialog.openinformation( shell parent, string title, string message)joptionpane.showmessagedialog(...) passing the messagetype joptionpane.information_message
询问是否(消息、询问图标、是和否按钮)messagedialog.openquestion( shell parent, string title, string question) 用户点击"是"就返回true,否则返回false。joptionpane.showconfirmdialog(...) passing the optiontype joptionpane.yes_no_option
警告(消息、警告图标、确认按钮)messagedialog.openwarning( shell parent, string title, string message) joptionpane.showmessagedialog(...) passing the messagetype joptionpane.warning_message

有人可能认为使用标准对话框的时候,joptionpane类比messagedialog提供了更大的灵活性。但是归根结底,在messagedialog的构造函数和自定义对话框的帮助下,你几乎可以实现所有的事务。messagedialog中缺少而joptionpane拥有的唯一的特性是在html中直接进行消息格式化。但是使用自定义对话框的时候是可以实现这种功能的。

对话框辅助类

现在我们知道了可供选择的类型了,让我们来建立invokatron需要的对话框吧。有两个地方需要对话框:

? 代码生成过程的确认信息,是否覆盖前面的代码。

? 输入一个值的对话框(与joptionpane.showinputdialog()类似)。

这个类中的第一个方法是用于确认代码覆盖的:

public static boolean openoverwritedialog(shell parent) {

return messagedialog.openconfirm(parent,

"confirmation",

"you are about to overwrite your class. " +

"are you sure you want to continue?");

}

上面的代码非常简单,我们仅仅建立了一个常规的确认对话框。输入对话框有点麻烦:messagedialog没有输入字段。我们只能建立一个新对话框类,可以是dialog的子类。我们也可以建立messagedialog的子类并重载它的createcustomarea()方法,添加输入字段。但是我们还有更简单的方法。

我们将使用inputdialog类:

public static string openinputdialog(

shell parent,

string title,

string question,

string initialvalue) {

inputdialog dlg = new inputdialog(

parent,

title,

question,

initialvalue,

null); //这是一个可供选择的有效的类

dlg.open();

if(dlg.getreturncode()!=window.ok) //点击"确认"了吗?

return null;

return dlg.getvalue();

}

我们的对话框辅助类完成了。你可以在图4中看到这些对话框。

eclipse插件开发之添加简单的gui元素

图4:对话框

eclipse交响乐

eclipse与音乐类似;一旦你学会了如何使用那些可供使用的乐器,你就能编写自己的交响乐了。在本文中我们简短地了解了两类工具:扩展点和对话框。

扫描关注微信公众号