有时候我们需要级联菜单中前方可以勾选(√),来表示当前系统的某种状态,这就需要用到可以打勾的菜单。
先看最终效果:
下面我们首先来看看怎么在plugin.xml中配置该菜单:
假设我们要做一个类似于powerdesigner样的数据库设计工具,其中表格在对话框中的显示只能是一下三种之一:
1)只显示主键 2)只显示主外键 3)全部显示
所以我们希望可以主菜单“视图”下加一个“表格图形显示”的级联菜单,“表格图形显示”下面有三个子菜单,用来表示上面的三种显示状态,于是在plugin.xml中org.eclipse.ui.commands扩展点下先建三个Command,截图如下:
注意,我们在每个command下都添加了一个state的节点,用来记录其command的状态值,下面附上state节点的截图:
记住,一个command下建立多个state节点时,它们的id值是不能重复的,我们在id中写的org.eclipse.ui.commands.toggleState其实是系统中RegistryToggleState.STATE_ID所定义的值,我们在这三个command节点下添加的state节点id和class都是相同的,如果你想系统在运行时,默认选择一种表格显示方式,只需要在这个显示方式的command下的state节点中class改成org.eclipse.ui.handlers.RegistryToggleState:true就行了。这样,我们需要的三个Command就配置完了,附上其对应的xml内容:
<command
id="sunline.suncard.powerdesigner.commands.onlyshowprimarykey"
name="%onlyshowprimarykey">
<state
class="org.eclipse.ui.handlers.RegistryToggleState:false"
id="org.eclipse.ui.commands.toggleState">
</state>
</command>
<command
id="sunline.suncard.powerdesigner.commands.showprimaryandforeign"
name="%showprimaryandforeign">
<state
class="org.eclipse.ui.handlers.RegistryToggleState:false"
id="org.eclipse.ui.commands.toggleState">
</state>
</command>
<command
id="sunline.suncard.powerdesigner.commands.showall"
name="%showall">
<state
class="org.eclipse.ui.handlers.RegistryToggleState:false"
id="org.eclipse.ui.commands.toggleState">
</state>
</command>
接下来我们给这三个command绑定handler,现在org.eclipse.ui.handlers扩展点下面建立三个handler,下面是其对应的xml内容:
<handler
class="cn.sunline.suncard.powerdesigner.handler.TableModelShowType_P"
commandId="sunline.suncard.powerdesigner.commands.onlyshowprimarykey">
</handler>
<handler
class="cn.sunline.suncard.powerdesigner.handler.TableModelShowType_PF"
commandId="sunline.suncard.powerdesigner.commands.showprimaryandforeign">
</handler>
<handler
class="cn.sunline.suncard.powerdesigner.handler.TableModelShowType_ALL"
commandId="sunline.suncard.powerdesigner.commands.showall">
</handler>
其中,我们建立了三个类,TableModelShowType_P用于处理只显示主键,TableModelShowType_PF用于处理显示主外键,TableModelShowType_ALL用于处理现实全部。最后会附上其中一个类的代码。
接下来就是在org.eclipse.ui.menus扩展点下建立menu节点,截图如下:
注意,这里的command节点需要在style的下拉列表中选择toggle风格!!
xml内容如下:
<menu
icon="icons/table_16.png"
label="%tablediagramshowtype">
<command
commandId="sunline.suncard.powerdesigner.commands.onlyshowprimarykey"
label="%onlyshowprimarykey"
style="toggle">
</command>
<command
commandId="sunline.suncard.powerdesigner.commands.showprimaryandforeign"
id="sunline.suncard.powerdesigner.commands.showprimaryandforeign"
label="%showprimaryandforeign"
name="%showprimaryandforegin"
style="toggle">
</command>
<command
commandId="sunline.suncard.powerdesigner.commands.showall"
label="%showall"
name="%showall"
style="toggle">
</command>
</menu>
接下来,我们可以看见效果了,运行系统后发现,这三个菜单都可以打勾,但根据我们的需求,只希望一个被大勾,这怎么办呢?于是,我们可以通过handler中的代码来控制,我们来看看其中一个handler——TableModelShowType_ALL(全部显示)中的代码内容:
public class TableModelShowType_ALL extends AbstractHandler{
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
Command allShowCommand = event.getCommand();
State allState = allShowCommand.getState(RegistryToggleState.STATE_ID);
allState.setValue(true);
// 因为全部显示菜单被勾选了,其他两个菜单需要设置为不勾选
ICommandService service = (ICommandService) PlatformUI.getWorkbench()
.getService(ICommandService.class);
// 设置“只显示主键”菜单为不勾选状态
Command pCommand = service.getCommand("sunline.suncard.powerdesigner.commands.onlyshowprimarykey");
State pState = pCommand.getState(RegistryToggleState.STATE_ID);
pState.setValue(false);
// 设置“显示主外键”菜单为不勾选状态
Command pfCommand = service.getCommand("sunline.suncard.powerdesigner.commands.showprimaryandforeign");
State pfState = pfCommand.getState(RegistryToggleState.STATE_ID);
pfState.setValue(false);
// 刷新菜单状态
service.refreshElements(allShowCommand.getId(), null);
service.refreshElements(pCommand.getId(), null);
service.refreshElements(pfCommand.getId(), null);
return null;
}
}
注意, allState.setValue(true); 保证了如果当前是“全部显示”菜单被勾选,用于如果继续点击“全部显示” 菜单,该菜单还是会被勾选,而不是被取消勾选。而且,如果这三个command下面的state节点的id不是org.eclipse.ui.commands.toggleState,假如“只显示主键”的command节点下的state节点的id是org.eclipse.ui.commands.toggleState_showall,则State pfState = pfCommand.getState(RegistryToggleState.STATE_ID); 需要改成State pfState = pfCommand.getState("org.eclipse.ui.commands.toggleState_showall");,否则获取的pfState将为空。但即使这样,你会发现行为达不到预期的效果,就是说“只显示主键”菜单依然我行我素,单击它它会勾选,再次单击它它会取消勾选,就是说pState.setValue(false);没有效果。调试过程中看下源代码会发现原因:
在HandlerProxy类中,有一个handleStateChange方法,该方法来自IStateListener接口,该接口也只有这一个方法,主要用来当菜单的状态改变时,需要旧的状态值需要用某一个值来更新。在HandlerProxy类中,实现代码如下
public void handleStateChange(State state, Object oldValue) {
if (state.getId().equals(RegistryToggleState.STATE_ID)) {
checkedState = state;
refreshElements();
} else if (state.getId().equals(RadioState.STATE_ID)) {
radioState = state;
refreshElements();
}
if (handler instanceof IStateListener) {
((IStateListener) handler).handleStateChange(state, oldValue);
}
}
因为你的state的id不是RegistryToggleState.STATE_ID,hander绑定的类也没有实现IStateListener接口,所以这个方法里面的代码根本没被执行,菜单的值和状态也没有得到更新。
相关推荐
在探讨RCP菜单与工具栏小结之前,我们先来明确一下RCP(Rich Client Platform)的概念。RCP是Eclipse平台的一部分,用于构建复杂的、数据丰富的桌面应用程序。它提供了强大的框架和工具集,使开发者能够创建具有高度...
在本话题中,我们将深入探讨"plugin2_RCP菜单_teamcenter_"所涉及的核心知识点,以及如何通过`plugin.xml`配置文件来开发和定制RCP的菜单和工具栏。 1. **RCP(Rich Client Platform)**:RCP是Eclipse框架的一部分...
在这个“eclipse rcp 菜单小例子”项目中,我们将深入探讨如何在Eclipse RCP应用中创建和配置菜单,以及如何通过`visibleWhen`标签控制菜单项的可见性。 首先,让我们了解Eclipse RCP中的菜单结构。菜单主要分为三...
这个压缩包包含了RCP应用中关于Navigator的一个示例,以及如何自定义“新建”(New) 右键菜单的操作。 在RCP应用中,Navigator视图是通过`org.eclipse.ui.navigator`插件提供的,这个插件包含了展示和管理工作台资源...
在Eclipse RCP(Rich Client Platform)开发中,创建用户友好的界面是至关重要的。一个常见的需求是定制透视图(Perspective)的交互方式,包括切换按钮和右键菜单。本教程将详细介绍如何通过`org.eclipse.ui....
本文将深入探讨“plugin1_RCP菜单_teamcenter_”这一主题,重点讲解如何在Teamcenter的RCP(Rich Client Platform)环境中开发一级和二级主菜单,并通过配置plugin.xml文件来实现这一功能。 首先,让我们理解什么是...
**RCP(Rich Client Platform)与OSGI详解** **RCP概述** RCP,全称为Rich Client Platform,是由Eclipse基金会开发的一种软件框架,主要用于构建功能丰富的桌面应用程序。RCP提供了一个灵活的基础平台,允许开发者...
"自己设计的小的RCP小示例程序"是一个基于Eclipse RCP框架的个人实践项目,展示了如何利用Eclipse RCP构建一个简单的桌面应用。 Eclipse RCP的核心概念包括: 1. **部件(Parts)**:这是构成用户界面的基本单元,...
在操作和维护方面,RCP-1500系列遥控面板提供了一个详细的菜单系统,包括菜单操作、状态画面、着色菜单、文件菜单、维护菜单和配置菜单等。用户可以通过这些菜单来进行高级的配置和设置,以确保设备的性能达到最佳。...
在IT领域,特别是软件开发中,RCP(Rich Client Platform)是一种基于Eclipse框架的应用程序开发模型,它允许开发者创建功能丰富的桌面应用程序。RCP弹出日期控件是这种环境中用于用户界面交互的一个重要组件,它...
"菜鸟Eclipse RCP学习之路"这个主题显然针对的是初学者,旨在引导他们逐步掌握如何使用Eclipse RCP进行软件开发。 首先,Eclipse RCP的核心概念是插件(Plugins)。每个插件代表应用程序的一个模块,它们通过OSGI...
**Eclipse RCP 开发教程** Eclipse Rich Client Platform (RCP) 是一个用于构建桌面应用程序的框架,它基于 Eclipse IDE ...开发者可以通过学习和实践,逐步掌握 RCP 的开发技巧,创建出满足需求的定制化应用程序。
RCP应用通常拥有和Eclipse类似的外观与操作体验,例如动态的菜单栏(Menubar)、工具栏(Toolbar)、编辑器(Editor)、视图(View)、工作台窗口(WorkbenchWindow)以及工作区(WorkSpace)等。这些组件共同构成了...
创建一个rcp工程,模板使用有一个view的 step2.创建popupMenu step2_1.新建类Action1: step2_2.添加扩展点: 好的step2已经结束了,现在您可以运行一下程序,看看效果. 接下来将要进行的是,只有选中Three时...
本教程旨在帮助读者自学Eclipse RCP插件式开发,掌握RCP的基本概念和开发技巧,无需任何前提条件,只需要具备基本的Java基础知识。 RCP插件式开发的优点在于: 1. 可重用eclipse中的方法和编码模式,提高开发效率...
RCP(Rich Client Platform)是Eclipse开源框架的一部分,它为构建桌面应用程序提供了一个灵活的平台。RCP在线升级是指在不卸载原有版本的情况下,通过网络更新来安装RCP应用的新版本,以确保用户始终能够使用最新...
添加菜单和工具栏是提升RCP程序交互性的关键步骤: 1. 创建菜单和工具栏:通过编程或者使用Eclipse的图形化工具(如Perspective Editor和Action Set Editor)来添加菜单项和工具栏按钮。 2. 绑定事件处理:为菜单项...
Eclipse RCP的核心特性之一是它的灵活性和可扩展性。这种灵活性体现在多个方面,例如通过插件机制可以轻松地添加新功能或修改现有行为。此外,Eclipse RCP还支持多种UI组件和技术,如Swing和SWT,这使得开发者可以...