`

在RCP中实现系统托盘功能

阅读更多
在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应用程序的系统托盘功能,使得程序在不占用桌面空间的情况下,仍然可以方便地被用户访问和控制。同时,通过右键菜单可以提供更多的操作选项,增强了用户体验。

    RCP系统开发

    - **系统托盘和定时提示**:系统托盘图标和定时气泡提示可以增强应用的用户体验,提醒用户有关信息或操作。 - **图片缓冲处理**:为了提高性能,RCP系统常使用图片缓冲技术,减少图像加载时间。 - **品牌化应用程序*...

    eclipse 3.6 rcp 开发

    - **介绍**: 在Eclipse RCP中添加系统托盘图标以提高应用的可用性。 - **实现**: 通过定义贡献点并实现IStatusLineManagerListener接口。 #### 5. 视图 - **概念**: 视图是在Eclipse RCP中用于展示数据的不同窗口。...

    Eclipse RCP详细教程

    - **插件**:在Eclipse RCP中,每个功能模块都被封装成一个独立的插件。这些插件包含了实现特定功能所需的所有代码和资源。 - **扩展**:插件可以通过扩展来增加新的功能或者改变现有功能的行为。扩展是一种动态的...

    Eclipse RCP Plug-in开发自学教程(Eclipse3.6)

    - 如何在RCP程序中添加和管理系统托盘图标及其交互。 5. **视图** - **添加示例视图**:创建基本的视图,并将其添加到RCP应用程序中。 - **添加自定义视图**:指导创建和集成自定义视图到RCP环境中。 - **向...

    eclipse RCP tutorial(中文教程)

    系统托盘是放置在屏幕右下角(Windows系统)的一个小图标区域,RCP应用程序可以通过此区域显示图标并提供快捷方式。实现系统托盘的关键步骤如下: 1. **定义托盘图标**:在插件中定义托盘图标的资源。 2. **注册托盘...

    RCP 开发自学教程

    - 在项目中定义编辑器的实现类。 - 配置插件元数据以支持该编辑器。 **6.4 调用编辑器** - **调用方式**: - 通过菜单项或其他方式启动编辑器。 **6.5 实例:文本编辑器实现** - **实现细节**: - 创建新的...

    eclipse的rcp开发

    11. **系统托盘(Tray)**:在系统托盘中添加图标,并处理相关的用户交互。 12. **闪屏(Splash Screen)**:设计和实现应用程序启动时显示的闪屏。 13. **产品绑定(Product Binding)**:创建产品的捆绑版本,包括...

    Eclipse RCP教程

    - **实现**:在Windows系统中创建系统托盘图标,提供对应用的快速访问。 #### 十九、添加状态行 ##### 20.1 设置状态行 - **状态行组件**:在主窗口底部添加状态行组件。 ##### 20.2 共享状态行 - **共享状态行**...

    Smart Client Development with RCP

    - **与桌面操作系统的紧密集成**:例如拖放(DnD)功能、系统托盘图标等。 - **易于部署和服务器集中管理**:这有助于降低总体拥有成本(TCO)。 - **利用本地文件系统和其他设备**:如打印机、读卡器等。 - **利用...

    Eclipse RCP Plugin 开发自学入门指南(CEC首发)

    4 系统托盘 ............................................................................................................................................ 37 5 视图 .........................................

    RcpChat-201301091119 更新修复有时候托盘没有图像

    这可能意味着在某些用户环境中,由于软件bug或其他系统兼容性问题,RcpChat 的图标未能正确显示在任务栏的系统托盘区域。 从标签 "RcpChat" 我们可以推测,RcpChat 是该软件的项目名称或者是产品的简称,可能是...

Global site tag (gtag.js) - Google Analytics