这几天一直在研究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
这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0001/1253/b9104f3d-6564-4c76-881e-6e512ae08caf-thumb.jpg)
- 描述: step2结束效果
- 大小: 13.1 KB
分享到:
- 2007-12-26 12:07
- 浏览 5243
- 评论(0)
- 论坛回复 / 浏览 (0 / 5493)
- 查看更多
相关推荐
看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。 setp1.创建一个rcp工程,模板使用有一个view的 step2.创建popupMenu step2_1.新建类Action1: step2_2.添加扩展点: 好的step2已经结束了,现在...
在移动设备上,为了提供良好的用户体验,经常需要使用遮罩层和弹出菜单来展示信息或进行交互操作。本文将详细讲解如何使用jQuery和CSS3实现手机端的遮罩层弹出菜单,以及它们的动画效果。 首先,我们需要理解遮罩层...
本教程将带你了解如何在Android Studio中实现一个带有动画效果的可弹出并收回的按钮菜单。这个功能不仅能够增加应用的交互性,还能为用户提供一种新颖的互动方式。 首先,我们需要设置一个基础的布局,通常是一个...
- **响应式显示**:当点击事件触发时,使用JavaScript改变弹出层的CSS属性(如`display`或`visibility`),使其可见。 - **关闭机制**:添加关闭按钮或设置点击弹出层外部自动关闭的逻辑,通常通过再次触发...
.menu ul li a:hover ul { visibility: visible; } .menu ul li a:hover ul.left { left: -105px; } <![endif]--> ``` 这些代码片段确保了在IE6及更低版本中的兼容性问题得到妥善解决。 #### 五、总结 通过以上...
知识点:纯DIV+CSS实现竖向三级弹出菜单 标题与描述中提到的“纯DIV+CSS制作的竖向三级导航弹出菜单代码”是指在网页设计中,不借助JavaScript等脚本语言,仅通过HTML的`div`元素和CSS样式表来实现一个具有竖向布局...
visibility: hidden; /* 默认隐藏 */ z-index: 9999; /* 高于页面其他元素 */ } .popup .content { position: relative; /* 可以在弹出层内部自由定位内容 */ padding: 20px; background-color: #fff; /* 提供...
本教程将详细讲解如何通过数据绑定来改变DataGrid中的列的可见性,即"DataGrid_Column_Visibility_Binding"的主题。 首先,我们需要了解WPF中的数据绑定基础。数据绑定允许UI元素的属性与应用程序中的数据源进行...
- 当触发弹出条件时,通过JavaScript改变 `#mask` 和 `#massage_box` 的 `visibility` 属性为 `visible`,使得弹出框和遮罩层可见。 - 用户可以通过拖动弹出框的头部区域来移动其位置。 3. **关闭逻辑**: - ...
"jQuery弹出层/jQuery弹出窗口/_全集"这个资源集合显然是一个包含多种jQuery弹出层和弹出窗口实现的综合教程或代码库。这些弹出效果通常用于显示通知、对话框、模态窗口、下拉菜单等多种用途,是网站用户交互的重要...
通过深入理解并灵活运用`visibility`属性,开发者可以创建出响应式且具有动态性的Android应用,提升用户体验。在`AndroidGone`这个主题下,重点是讨论`gone`状态的使用场景和技巧,如何有效地利用它来优化布局和提高...
- `opacity`/`visibility`: 控制元素的可见性,`opacity: 0`会使其透明,`visibility: hidden`则完全不可见。 - `transition`: 添加平滑过渡效果,如`transition: opacity 0.3s ease-in-out;`。 3. **JavaScript ...
然而,也要注意合理使用弹出层,避免过于频繁或不必要的弹出,以免影响用户体验。 总的来说,理解和掌握JS弹出层的实现方法对于前端开发者来说是一项重要的技能。通过分析和使用提供的源代码,可以加深对这一概念的...
3. **JavaScript 控制**:通过JavaScript来监听用户的交互,例如点击事件,当触发事件时,改变弹出层的CSS属性(如display或visibility)以控制其显示和隐藏。 4. **模态与非模态**:模态弹出层不允许用户与页面...
为了提供更加直观、便捷的操作界面,设计师们常常会采用动态弹出菜单。这种技术使得用户只需轻点按钮,即可显示或隐藏丰富的选项,而不会过度占用页面空间。"jQuery点击美化的下拉框动态弹出菜单代码"正是这样一种...
可能是一个CSS文件或一个包含HTML结构的文件,用于构建和定制弹出层的外观和行为。结合这些资源,我们可以进一步完善弹出层的设计,比如调整弹出层的大小、形状、背景色、边框等。 总的来说,中间弹出层js技术是...
微信小程序的弹出层设计通常包括一个可点击的按钮来触发弹出,以及在弹出层右上角设置一个关闭按钮,允许用户方便地关闭该层。本篇文章将深入探讨如何实现这一功能,并分享相关的知识点。 首先,我们需要了解微信小...
在本文中,我们将深入探讨如何在layui框架中利用弹出层(layer)进行回调操作,以便获取弹出层内的数据。layui是一个轻量级、模块化的前端UI框架,提供了丰富的组件,包括弹出层功能,使得用户交互变得更加便捷。在...
在 XML 文件中,我们可以使用不同的 visibility 属性值来设置控件的可见性,而在 Java 代码中,我们可以使用不同的 VISIBILITY 常量来设置控件的可见性。这些状态的区别在于对控件的显示和布局的影响,它们可以帮助...
例如,`display: none` 和 `visibility: hidden` 都可以用来隐藏元素,但它们在动画效果和布局计算上有所不同。确保使用广泛支持的CSS属性,如`opacity`而不是`filter`。 2. 事件处理:jQuery提供了一致的事件接口...