java swt 右键菜单_SWT 右键菜单

本文介绍了如何在Java SWT环境中启用和管理右键菜单,包括在ApplicationWorkbenchWindowAdvisor中设置菜单栏,创建并添加菜单项,以及自定义Action实现ISelectionListener来响应用户选择。示例中详细展示了如何创建退出、关于和添加联系人的菜单项,并通过监听选择事件来控制菜单项的启用状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Top-level Menu(1)在 ApplicationWorkbenchWindowAdvisor#preWindowOpen() 方法中启用菜单:

configurer.setShowMenuBar(true);

此方法调用并不一定显示菜单,只有当菜单中包含菜单项时,菜单才会显示。

(2)创建并添加菜单项

org.eclipsercp.hyperbola/ApplicationActionBarAdvisor

private IWorkbenchAction exitAction;

private IWorkbenchAction aboutAction;

private AddContactAction addContactAction;

protected

void makeActions(IWorkbenchWindow window) {

exitAction = ActionFactory.QUIT.create(window);

register(exitAction);

aboutAction = ActionFactory.ABOUT.create(window);

register(aboutAction);

addContactAction =

new AddContactAction(window);

register(addContactAction);

}

protected

void fillMenuBar(IMenuManager menuBar) {

MenuManager hyperbolaMenu =

new MenuManager(

"&Hyperbola",

"hyperbola");

hyperbolaMenu.add(addContactAction);

hyperbolaMenu.add(

new Separator());

hyperbolaMenu.add(exitAction);

MenuManager helpMenu =

new MenuManager(

"&Help",

"help");

helpMenu.add(aboutAction);

menuBar.add(hyperbolaMenu);

menuBar.add(helpMenu);

}

退出和关于菜单使用 org.eclipse.iu.actions.ActionFactory 中预设的 action。

通过 register 方法注册一个action,这样在 workbench window 退出后可以销毁这些资源。

MenuManager.add() 方法可将 action 添加到菜单项,或者将其他 MenuManager 添加到子菜单。

(3)创建自定义菜单项:Action

public

class

AddContactAction

extends Action

implements ISelectionListener,

ActionFactory.IWorkbenchAction {

private

final IWorkbenchWindow window;

public

final

static String ID =

"org.eclipsercp.hyperbola.addContact";

private IStructuredSelection selection;

public AddContactAction(IWorkbenchWindow window) {

this.window = window;

setId(ID);

setText(

"&Add Contact...");

setToolTipText(

"Add a contact to your contacts list.");

setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(

"org.eclipsercp.hyperbola", IImageKeys.ADD_CONTACT));

window.getSelectionService().addSelectionListener(

this);

}

public

void dispose() {

window.getSelectionService().removeSelectionListener(this);

}

public

void selectionChanged(IWorkbenchPart part, ISelection incoming) {

// Selection containing elements

if (incoming

instanceof IStructuredSelection) {

selection = (IStructuredSelection) incoming;

setEnabled(selection.size() == 1

&& selection.getFirstElement()

instanceof ContactsGroup);

}

else {

// Other selections, for example containing text or of other kinds.

setEnabled(

false);

}

}

public

void run() {

AddContactDialog d =

new AddContactDialog(window.getShell());

int code = d.open();

if (code == Window.OK) {

Object item = selection.getFirstElement();

ContactsGroup group = (ContactsGroup) item;

ContactsEntry entry =

new ContactsEntry(group, d.getUserId(), d

.getNickname(), d.getServer());

group.addEntry(entry);

}

}

}

构造函数中注册了一个 ISelectionListener 到 window.getSelectionService() 中,这样当 window 发生 selection change 事件时,此 Action 就会收到相应的事件通知,并调用此类的 selectionChanged 方法。这个方法首先判断发生事件的是不是 IStructuredSelection 对象(用于区分 editor 中选择文字所触发此事件的情况),IStructuredSelection 接口的继承关系如下图:

0818b9ca8b590ca3270a3433284dd417.png

window 本身并不产生 selection 事件,而 editors 和 views 可以作为 selection provider 注册到 window 上,将其产生的 selection 事件通知给 window.getSelectionService() 上的 ISelectionListener (本例是 实现了 ISelectionListener 接口的 AddContactAction)。ContactsView 在 createPartControl 方法中调用 getSite().setSelectionProvider(treeViewer) 方法将自己注册为selection provider 。

注意:此 Action 还实现了 ActionFactory.IWorkbenchAction 接口,并在 dispose 接口方法中从window.getSelectionService() 删除了 ISelectionListener 来释放资源,避免内存泄露

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值