在RCP中实现系统托盘功能
在RCP中加入系统托盘功能,类似msn和QQ。
功能就不说了。
在RCP的WorkbenchWindowAdvisor的postWindowOpen()中创建系统托盘,另外要override preWindowShellClose()方法(按窗口右上角X关闭),否则按程序右上角的X,整个程序就会被关闭,重写后实现程序最小化的功能。
主要是重载ApplicationWorkbenchWindowAdvisor.java中的方法
/**
* ApplicationWorkbenchWindowAdvisor.java
*/
package com.mi.pwdgate;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.IWorkbenchPreferenceConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
import com.mi.pwdgate.util.SystemTrayMaster;
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
private SystemTrayMaster trayMaster;
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.application.WorkbenchWindowAdvisor#postWindowOpen()
*/
public void postWindowOpen() {
createSystemTray();
}
private void createSystemTray() {
trayMaster = new SystemTrayMaster();
trayMaster.createSystemTray();
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.application.WorkbenchWindowAdvisor#preWindowShellClose()
* 按窗口右上角X关闭
*/
public boolean preWindowShellClose() {
System.out.println("shell going to closed!");
trayMaster.minimizeWindow();
return false;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.application.WorkbenchWindowAdvisor#postWindowClose()
* 所有关闭窗口的事件都从这里走,收尾工作的代码在这里写
*/
public void postWindowClose() {
System.out.println("closed!");
}
}
/**
* SystemTrayMaster.java
*/
package com.mi.pwdgate.util;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;
import org.eclipse.ui.PlatformUI;
/**
* @author moneyice 2006-5-9
*/
public class SystemTrayMaster implements SelectionListener, Listener {
private final class RestoreWindowListener extends SelectionAdapter {
public void widgetSelected(SelectionEvent e) {
restoreWindow();
}
}
private Menu menu;
private MenuItem[] menuItems = new MenuItem[0];
private RestoreWindowListener restoreWindowListener;
public SystemTrayMaster() {
this.restoreWindowListener = new RestoreWindowListener();
}
// Closes the Application
protected void closeApplication() {
PlatformUI.getWorkbench().close();
}
// click the tray
public void widgetSelected(SelectionEvent e) {
}
// double click the tray
public void widgetDefaultSelected(SelectionEvent e) {
restoreWindow();
}
// Gets system shell
private Shell getShell() {
return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
}
// Minimizes the Window
public void minimizeWindow() {
getShell().setMinimized(true);
getShell().setVisible(false);
}
// Restores the window
protected void restoreWindow() {
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getShell();
shell.open();
shell.setMinimized(false);
shell.forceActive();
shell.forceFocus();
}
public void showMenu() {
clearItems();
MenuItem openItem;
MenuItem closeItem;
openItem = new MenuItem(this.menu, SWT.PUSH);
closeItem = new MenuItem(this.menu, SWT.NONE);
closeItem.setText("Close");
closeItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
closeApplication();
}
});
this.menuItems = new MenuItem[] { openItem, closeItem };
openItem.setText("Open Password Gate");
openItem.addSelectionListener(this.restoreWindowListener);
this.menu.setVisible(true);
}
private void clearItems() {
for (int i = 0; i < this.menuItems.length; i++) {
MenuItem item = this.menuItems[i];
item.removeSelectionListener(this.restoreWindowListener);
this.menuItems[i].dispose();
}
}
public void handleEvent(Event event) {
showMenu();
}
public void createSystemTray() {
// Gets system tray
Tray tray = Display.getDefault().getSystemTray();
// Creates tray item
TrayItem item = new TrayItem(tray, SWT.NONE);
item.setText("Password Gate");
item.setToolTipText("Password Gate");
// Sets image for tray
Image image = ImageShop.get("default");
item.setImage(image);
item.addSelectionListener(this);
item.addListener(SWT.MenuDetect, this);
menu = new Menu(getShell(), SWT.POP_UP);
}
}
分享到:
相关推荐
通过以上步骤,可以实现一个完整的RCP应用程序的系统托盘功能,使得程序在不占用桌面空间的情况下,仍然可以方便地被用户访问和控制。同时,通过右键菜单可以提供更多的操作选项,增强了用户体验。
- **系统托盘和定时提示**:系统托盘图标和定时气泡提示可以增强应用的用户体验,提醒用户有关信息或操作。 - **图片缓冲处理**:为了提高性能,RCP系统常使用图片缓冲技术,减少图像加载时间。 - **品牌化应用程序*...
- **介绍**: 在Eclipse RCP中添加系统托盘图标以提高应用的可用性。 - **实现**: 通过定义贡献点并实现IStatusLineManagerListener接口。 #### 5. 视图 - **概念**: 视图是在Eclipse RCP中用于展示数据的不同窗口。...
- **插件**:在Eclipse RCP中,每个功能模块都被封装成一个独立的插件。这些插件包含了实现特定功能所需的所有代码和资源。 - **扩展**:插件可以通过扩展来增加新的功能或者改变现有功能的行为。扩展是一种动态的...
- 如何在RCP程序中添加和管理系统托盘图标及其交互。 5. **视图** - **添加示例视图**:创建基本的视图,并将其添加到RCP应用程序中。 - **添加自定义视图**:指导创建和集成自定义视图到RCP环境中。 - **向...
系统托盘是放置在屏幕右下角(Windows系统)的一个小图标区域,RCP应用程序可以通过此区域显示图标并提供快捷方式。实现系统托盘的关键步骤如下: 1. **定义托盘图标**:在插件中定义托盘图标的资源。 2. **注册托盘...
- 在项目中定义编辑器的实现类。 - 配置插件元数据以支持该编辑器。 **6.4 调用编辑器** - **调用方式**: - 通过菜单项或其他方式启动编辑器。 **6.5 实例:文本编辑器实现** - **实现细节**: - 创建新的...
11. **系统托盘(Tray)**:在系统托盘中添加图标,并处理相关的用户交互。 12. **闪屏(Splash Screen)**:设计和实现应用程序启动时显示的闪屏。 13. **产品绑定(Product Binding)**:创建产品的捆绑版本,包括...
- **实现**:在Windows系统中创建系统托盘图标,提供对应用的快速访问。 #### 十九、添加状态行 ##### 20.1 设置状态行 - **状态行组件**:在主窗口底部添加状态行组件。 ##### 20.2 共享状态行 - **共享状态行**...
- **与桌面操作系统的紧密集成**:例如拖放(DnD)功能、系统托盘图标等。 - **易于部署和服务器集中管理**:这有助于降低总体拥有成本(TCO)。 - **利用本地文件系统和其他设备**:如打印机、读卡器等。 - **利用...
4 系统托盘 ............................................................................................................................................ 37 5 视图 .........................................
这可能意味着在某些用户环境中,由于软件bug或其他系统兼容性问题,RcpChat 的图标未能正确显示在任务栏的系统托盘区域。 从标签 "RcpChat" 我们可以推测,RcpChat 是该软件的项目名称或者是产品的简称,可能是...