`
solonote
  • 浏览: 90547 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

阅读更多
这几天一直在研究popupMenu的Action,想要达到的目是选中不同的东西弹出不同的菜单。网上有很多介绍的文章,不过很多文章都是一些翻译过来并且作者没有自己实践过的东西,浪费了我很多时间,最后自己通过摸索,终于找出了这个问题的解决办法。

1.文章类型:
这是一篇解决问题的教程,不讨论技术的背景知识,比如运用到何种设计模式,以及实现背后的原理等问题。

2.此文对您的帮助:
看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。

setp1.创建一个rcp工程,模板使用有一个view的

step2.创建popupMenu
step2_1.新建类Action1:
package solonote.example.popupmenu;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;

public class Action1 implements IObjectActionDelegate {

	@Override
	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
		// TODO Auto-generated method stub

	}

	@Override
	public void run(IAction action) {
		// TODO Auto-generated method stub

	}

	@Override
	public void selectionChanged(IAction action, ISelection selection) {
		// TODO Auto-generated method stub

	}

}


step2_2.添加扩展点:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>

   <extension
         id="application"
         point="org.eclipse.core.runtime.applications">
      <application>
         <run
               class="solonote.example.popupmenu.Application">
         </run>
      </application>
   </extension>
   <extension
         point="org.eclipse.ui.perspectives">
      <perspective
            name="Perspective"
            class="solonote.example.popupmenu.Perspective"
            id="solonote.example.popupMenu.perspective">
      </perspective>
   </extension>
   <extension
         point="org.eclipse.ui.views">
      <view
            name="View"
            class="solonote.example.popupmenu.View"
            id="solonote.example.popupMenu.view">
      </view>
   </extension>
   <!-- 弹出菜单的定义 -->
   <extension
         point="org.eclipse.ui.popupMenus">
      <objectContribution
            id="objectContribution"
            objectClass="java.lang.Object">
         <action
               class="solonote.example.popupmenu.Action1"
               id="solonote.example.popupMenu.action1"
               label="label">
         </action>
      </objectContribution>
   </extension>

</plugin>


step2_3设置弹出菜单的弹出位置
修改View类
package solonote.example.popupmenu;

import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

public class View extends ViewPart {
	public static final String ID = "solonote.example.popupMenu.view";

	private TableViewer viewer;

	/**
	 * The content provider class is responsible for providing objects to the
	 * view. It can wrap existing objects in adapters or simply return objects
	 * as-is. These objects may be sensitive to the current input of the view,
	 * or ignore it and always show the same content (like Task List, for
	 * example).
	 */
	class ViewContentProvider implements IStructuredContentProvider {
		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
		}

		public void dispose() {
		}

		public Object[] getElements(Object parent) {
			return new SimpleDTO[] { new SimpleDTO("One"), new SimpleDTO("Two"),  new SimpleDTO("Three") };
			
		}
	}

	class ViewLabelProvider extends LabelProvider implements
			ITableLabelProvider {
		public String getColumnText(Object obj, int index) {
			SimpleDTO dto = (SimpleDTO) obj;
			return dto.getName();
		}

		public Image getColumnImage(Object obj, int index) {
			return getImage(obj);
		}

		public Image getImage(Object obj) {
			return PlatformUI.getWorkbench().getSharedImages().getImage(
					ISharedImages.IMG_OBJ_ELEMENT);
		}
	}

	/**
	 * This is a callback that will allow us to create the viewer and initialize
	 * it.
	 */
	public void createPartControl(Composite parent) {
		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
				| SWT.V_SCROLL);
		viewer.setContentProvider(new ViewContentProvider());
		viewer.setLabelProvider(new ViewLabelProvider());
		viewer.setInput(getViewSite());
		
		//初始化弹出菜单
		MenuManager popupMenuManager = new MenuManager("#PopupMenu");
		popupMenuManager.setRemoveAllWhenShown(true);
		Menu popupMenu = popupMenuManager.createContextMenu(viewer.getTable());
		viewer.getTable().setMenu(popupMenu);
		//设置选择提供者和弹出菜单
		getSite().setSelectionProvider(viewer);
		getSite().registerContextMenu(popupMenuManager, viewer);
	}

	/**
	 * Passing the focus request to the viewer's control.
	 */
	public void setFocus() {
		viewer.getControl().setFocus();
	}
}


好的step2已经结束了,现在您可以运行一下程序,看看效果.

接下来将要进行的是,只有选中Three时菜单才弹出,选择其他两个则不弹出。
确切的说是只有选择Three时     
<objectContribution
            id="objectContribution"
            objectClass="java.lang.Object">
节点中的Action才显示.

接下来:
step3_1修改扩展点 增加visibility项
  <!-- 弹出菜单的定义 -->
   <extension
         point="org.eclipse.ui.popupMenus">
      <objectContribution
            id="objectContribution"
            objectClass="java.lang.Object">
         <action
               class="solonote.example.popupmenu.Action1"
               id="solonote.example.popupMenu.action1"
               label="label">
         </action>
         <visibility>
            <objectState
                  name="name"
                  value="Three">
            </objectState>
         </visibility>
      </objectContribution>
   </extension>


修改被选中的DTO,让其实现IActionFilter接口
package solonote.example.popupmenu;

import org.eclipse.ui.IActionFilter;

/**
 * Viewer显示的项
 * @author solonote
 * @version 0.1.0 2007-12-26 上午11:49:41
 */
public class SimpleDTO implements IActionFilter{
	/**
	 * 显示的名字
	 */
	private String name;

	/**
	 * 返回显示的名字
	 * @return 显示的名字
	 */
	public String getName() {
		return name;
	}

	/**
	 * 设置显示的名字
	 * @param name 显示的名字
	 */
	public void setName(String name) {
		this.name = name;
	}

	public SimpleDTO(String name) {
		super();
		this.name = name;
	}

	/**
	 * 选择时候是否显示Action的判断
	 * <visibility>
            <objectState
                  name="name"
                  value="Three">
            </objectState>
         </visibility>
	 * @param target 选择的东西
	 * @param name plugin.xml里配置的name
	 * @param value plugin.xml里配置的value
	 */
	@Override
	public boolean testAttribute(Object target, String name, String value) {
		System.out.println(name);
		System.out.println(value);
		System.out.println(target);
		SimpleDTO dto = (SimpleDTO) target;
		if(dto.getName().equals(value))
			return true;	
		return false;
	}
	
	
}


然后就完成了,当然实际运用中我运用了Adapter将DTO适配成IActionFilter接口,这样DTO就不用和IActionFilter接口耦合了,或许以后的文章会接受如何适配。这里已经解决了问题,好的如果有任何疑问请联系我
solonote@163.com
这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.
  • 描述: step2结束效果
  • 大小: 13.1 KB
  • popupMenu.zip (21.2 KB)
  • 描述: eclipse工程
  • 下载次数: 333
分享到:
评论

相关推荐

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

    看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。 setp1.创建一个rcp工程,模板使用有一个view的 step2.创建popupMenu step2_1.新建类Action1: step2_2.添加扩展点: 好的step2已经结束了,现在...

    jQuery手机端遮罩层弹出菜单CSS3动画出现和消失代码

    在移动设备上,为了提供良好的用户体验,经常需要使用遮罩层和弹出菜单来展示信息或进行交互操作。本文将详细讲解如何使用jQuery和CSS3实现手机端的遮罩层弹出菜单,以及它们的动画效果。 首先,我们需要理解遮罩层...

    Android带有动画效果可弹出并收回的一组按钮菜单

    本教程将带你了解如何在Android Studio中实现一个带有动画效果的可弹出并收回的按钮菜单。这个功能不仅能够增加应用的交互性,还能为用户提供一种新颖的互动方式。 首先,我们需要设置一个基础的布局,通常是一个...

    导航弹出层

    - **响应式显示**:当点击事件触发时,使用JavaScript改变弹出层的CSS属性(如`display`或`visibility`),使其可见。 - **关闭机制**:添加关闭按钮或设置点击弹出层外部自动关闭的逻辑,通常通过再次触发...

    div制作的弹出菜单

    .menu ul li a:hover ul { visibility: visible; } .menu ul li a:hover ul.left { left: -105px; } &lt;![endif]--&gt; ``` 这些代码片段确保了在IE6及更低版本中的兼容性问题得到妥善解决。 #### 五、总结 通过以上...

    纯DIV+CSS制作的竖向三级弹出菜单代码

    知识点:纯DIV+CSS实现竖向三级弹出菜单 标题与描述中提到的“纯DIV+CSS制作的竖向三级导航弹出菜单代码”是指在网页设计中,不借助JavaScript等脚本语言,仅通过HTML的`div`元素和CSS样式表来实现一个具有竖向布局...

    实现网页蒙板效果和弹出层的html示例

    visibility: hidden; /* 默认隐藏 */ z-index: 9999; /* 高于页面其他元素 */ } .popup .content { position: relative; /* 可以在弹出层内部自由定位内容 */ padding: 20px; background-color: #fff; /* 提供...

    DataGrid_Column_Visibility_Binding

    本教程将详细讲解如何通过数据绑定来改变DataGrid中的列的可见性,即"DataGrid_Column_Visibility_Binding"的主题。 首先,我们需要了解WPF中的数据绑定基础。数据绑定允许UI元素的属性与应用程序中的数据源进行...

    AJAX弹出提示信息效果

    - 当触发弹出条件时,通过JavaScript改变 `#mask` 和 `#massage_box` 的 `visibility` 属性为 `visible`,使得弹出框和遮罩层可见。 - 用户可以通过拖动弹出框的头部区域来移动其位置。 3. **关闭逻辑**: - ...

    jQuery弹出层/jQuery弹出窗口/_全集

    "jQuery弹出层/jQuery弹出窗口/_全集"这个资源集合显然是一个包含多种jQuery弹出层和弹出窗口实现的综合教程或代码库。这些弹出效果通常用于显示通知、对话框、模态窗口、下拉菜单等多种用途,是网站用户交互的重要...

    Android中visibility属性

    通过深入理解并灵活运用`visibility`属性,开发者可以创建出响应式且具有动态性的Android应用,提升用户体验。在`AndroidGone`这个主题下,重点是讨论`gone`状态的使用场景和技巧,如何有效地利用它来优化布局和提高...

    弹出层效果(源代码)

    - `opacity`/`visibility`: 控制元素的可见性,`opacity: 0`会使其透明,`visibility: hidden`则完全不可见。 - `transition`: 添加平滑过渡效果,如`transition: opacity 0.3s ease-in-out;`。 3. **JavaScript ...

    JS弹出层源代码

    然而,也要注意合理使用弹出层,避免过于频繁或不必要的弹出,以免影响用户体验。 总的来说,理解和掌握JS弹出层的实现方法对于前端开发者来说是一项重要的技能。通过分析和使用提供的源代码,可以加深对这一概念的...

    [WEB开源]弹出层效果

    3. **JavaScript 控制**:通过JavaScript来监听用户的交互,例如点击事件,当触发事件时,改变弹出层的CSS属性(如display或visibility)以控制其显示和隐藏。 4. **模态与非模态**:模态弹出层不允许用户与页面...

    jQuery点击美化的下拉框动态弹出菜单代码.rar

    为了提供更加直观、便捷的操作界面,设计师们常常会采用动态弹出菜单。这种技术使得用户只需轻点按钮,即可显示或隐藏丰富的选项,而不会过度占用页面空间。"jQuery点击美化的下拉框动态弹出菜单代码"正是这样一种...

    中间弹出层js

    可能是一个CSS文件或一个包含HTML结构的文件,用于构建和定制弹出层的外观和行为。结合这些资源,我们可以进一步完善弹出层的设计,比如调整弹出层的大小、形状、背景色、边框等。 总的来说,中间弹出层js技术是...

    微信小程序弹出层,右上角关闭按钮

    微信小程序的弹出层设计通常包括一个可点击的按钮来触发弹出,以及在弹出层右上角设置一个关闭按钮,允许用户方便地关闭该层。本篇文章将深入探讨如何实现这一功能,并分享相关的知识点。 首先,我们需要了解微信小...

    layui 弹出层回调获取弹出层数据的例子

    在本文中,我们将深入探讨如何在layui框架中利用弹出层(layer)进行回调操作,以便获取弹出层内的数据。layui是一个轻量级、模块化的前端UI框架,提供了丰富的组件,包括弹出层功能,使得用户交互变得更加便捷。在...

    VIsibility属性

    在 XML 文件中,我们可以使用不同的 visibility 属性值来设置控件的可见性,而在 Java 代码中,我们可以使用不同的 VISIBILITY 常量来设置控件的可见性。这些状态的区别在于对控件的显示和布局的影响,它们可以帮助...

    jquery弹出层兼容所有浏览器.zip

    例如,`display: none` 和 `visibility: hidden` 都可以用来隐藏元素,但它们在动画效果和布局计算上有所不同。确保使用广泛支持的CSS属性,如`opacity`而不是`filter`。 2. 事件处理:jQuery提供了一致的事件接口...

Global site tag (gtag.js) - Google Analytics