`
manzhizhen
  • 浏览: 293346 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

RCP小技巧之带勾(toggle)的菜单

    博客分类:
  • RCP
阅读更多

  有时候我们需要级联菜单中前方可以勾选(√),来表示当前系统的某种状态,这就需要用到可以打勾的菜单。

先看最终效果:

 

 

 

下面我们首先来看看怎么在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接口,所以这个方法里面的代码根本没被执行,菜单的值和状态也没有得到更新。

 

 

 

 


 

  • 大小: 20.1 KB
  • 大小: 20.8 KB
  • 大小: 9.6 KB
  • 大小: 64.3 KB
分享到:
评论

相关推荐

    RCP 菜单与工具栏小结

    在探讨RCP菜单与工具栏小结之前,我们先来明确一下RCP(Rich Client Platform)的概念。RCP是Eclipse平台的一部分,用于构建复杂的、数据丰富的桌面应用程序。它提供了强大的框架和工具集,使开发者能够创建具有高度...

    plugin2_RCP菜单_teamcenter_

    在本话题中,我们将深入探讨"plugin2_RCP菜单_teamcenter_"所涉及的核心知识点,以及如何通过`plugin.xml`配置文件来开发和定制RCP的菜单和工具栏。 1. **RCP(Rich Client Platform)**:RCP是Eclipse框架的一部分...

    eclipse rcp 菜单小例子

    在这个“eclipse rcp 菜单小例子”项目中,我们将深入探讨如何在Eclipse RCP应用中创建和配置菜单,以及如何通过`visibleWhen`标签控制菜单项的可见性。 首先,让我们了解Eclipse RCP中的菜单结构。菜单主要分为三...

    RCP的Navigator例子源代码(包括修改默认的new右键菜单)

    这个压缩包包含了RCP应用中关于Navigator的一个示例,以及如何自定义“新建”(New) 右键菜单的操作。 在RCP应用中,Navigator视图是通过`org.eclipse.ui.navigator`插件提供的,这个插件包含了展示和管理工作台资源...

    RCP自定义透视图切换按钮的右键菜单

    在Eclipse RCP(Rich Client Platform)开发中,创建用户友好的界面是至关重要的。一个常见的需求是定制透视图(Perspective)的交互方式,包括切换按钮和右键菜单。本教程将详细介绍如何通过`org.eclipse.ui....

    plugin1_RCP菜单_teamcenter_

    本文将深入探讨“plugin1_RCP菜单_teamcenter_”这一主题,重点讲解如何在Teamcenter的RCP(Rich Client Platform)环境中开发一级和二级主菜单,并通过配置plugin.xml文件来实现这一功能。 首先,让我们理解什么是...

    RCP,RCP开发

    **RCP(Rich Client Platform)与OSGI详解** **RCP概述** RCP,全称为Rich Client Platform,是由Eclipse基金会开发的一种软件框架,主要用于构建功能丰富的桌面应用程序。RCP提供了一个灵活的基础平台,允许开发者...

    自己设计的小的RCP小示例程序

    "自己设计的小的RCP小示例程序"是一个基于Eclipse RCP框架的个人实践项目,展示了如何利用Eclipse RCP构建一个简单的桌面应用。 Eclipse RCP的核心概念包括: 1. **部件(Parts)**:这是构成用户界面的基本单元,...

    RCP-1500中文操作手册.pdf

    在操作和维护方面,RCP-1500系列遥控面板提供了一个详细的菜单系统,包括菜单操作、状态画面、着色菜单、文件菜单、维护菜单和配置菜单等。用户可以通过这些菜单来进行高级的配置和设置,以确保设备的性能达到最佳。...

    RCP弹出日期控件

    在IT领域,特别是软件开发中,RCP(Rich Client Platform)是一种基于Eclipse框架的应用程序开发模型,它允许开发者创建功能丰富的桌面应用程序。RCP弹出日期控件是这种环境中用于用户界面交互的一个重要组件,它...

    菜鸟EclipseRCP学习之路

    "菜鸟Eclipse RCP学习之路"这个主题显然针对的是初学者,旨在引导他们逐步掌握如何使用Eclipse RCP进行软件开发。 首先,Eclipse RCP的核心概念是插件(Plugins)。每个插件代表应用程序的一个模块,它们通过OSGI...

    Eclipse RCP开发教程

    **Eclipse RCP 开发教程** Eclipse Rich Client Platform (RCP) 是一个用于构建桌面应用程序的框架,它基于 Eclipse IDE ...开发者可以通过学习和实践,逐步掌握 RCP 的开发技巧,创建出满足需求的定制化应用程序。

    Eclipse Rcp

    RCP应用通常拥有和Eclipse类似的外观与操作体验,例如动态的菜单栏(Menubar)、工具栏(Toolbar)、编辑器(Editor)、视图(View)、工作台窗口(WorkbenchWindow)以及工作区(WorkSpace)等。这些组件共同构成了...

    RCP popupMene高级教程 使用Visibility定制弹出菜单

    创建一个rcp工程,模板使用有一个view的 step2.创建popupMenu step2_1.新建类Action1: step2_2.添加扩展点: 好的step2已经结束了,现在您可以运行一下程序,看看效果. 接下来将要进行的是,只有选中Three时...

    eclipse RCP Plug-in开发自学教程.pdf

    本教程旨在帮助读者自学Eclipse RCP插件式开发,掌握RCP的基本概念和开发技巧,无需任何前提条件,只需要具备基本的Java基础知识。 RCP插件式开发的优点在于: 1. 可重用eclipse中的方法和编码模式,提高开发效率...

    RCP在线升级,RCP在线升级

    RCP(Rich Client Platform)是Eclipse开源框架的一部分,它为构建桌面应用程序提供了一个灵活的平台。RCP在线升级是指在不卸载原有版本的情况下,通过网络更新来安装RCP应用的新版本,以确保用户始终能够使用最新...

    eclipse rcp 自学教程

    添加菜单和工具栏是提升RCP程序交互性的关键步骤: 1. 创建菜单和工具栏:通过编程或者使用Eclipse的图形化工具(如Perspective Editor和Action Set Editor)来添加菜单项和工具栏按钮。 2. 绑定事件处理:为菜单项...

    Eclipse RCP详细教程

    Eclipse RCP的核心特性之一是它的灵活性和可扩展性。这种灵活性体现在多个方面,例如通过插件机制可以轻松地添加新功能或修改现有行为。此外,Eclipse RCP还支持多种UI组件和技术,如Swing和SWT,这使得开发者可以...

Global site tag (gtag.js) - Google Analytics