/**
* */ package com.digitalcontent.communication; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Monitor; import org.eclipse.swt.graphics.Rectangle; /** * @author 廖龙龙 * * 2008-7-26 */ public class WorkSpace { private Shell mainwindowShell = null; private HookSysTray sysTray=null; /** * @param args */ public static void main(String[] args) { WorkSpace thisClass = new WorkSpace(); thisClass.openmain(); } /** * This method initializes sShell */ private void createSShell() { mainwindowShell = new Shell(); mainwindowShell.setText("主窗口"); mainwindowShell.setSize(new Point(260, 200)); mainwindowShell.setLayout(new GridLayout()); //设置窗口在屏幕上的初始位置,在屏幕的中间显示主窗口 Monitor primary = mainwindowShell.getMonitor(); Rectangle bounds = primary.getBounds(); Rectangle rect =mainwindowShell.getBounds(); // 获取屏幕高度(screenH)和宽度(screenW) // int screenH = bounds.height; // int screenW = bounds.width; // System.out.println("屏幕的分辨率为:"+screenW+"*"+screenH); int x = bounds.x + (bounds.width - rect.width) / 2; int y = bounds.y + (bounds.height - rect.height) / 2; if (x < 0) x = 0; if (y < 0) y = 0; //定位对象窗口坐标 mainwindowShell.setLocation(x, y); //关闭主窗口 mainwindowShell .addShellListener(new org.eclipse.swt.events.ShellAdapter() { public void shellClosed(org.eclipse.swt.events.ShellEvent e) { //重载关闭对话框方法 closeWindow(); } }); } public void openmain(){ Display display = Display.getDefault(); createSShell(); //显示系统托盘 sysTray=new HookSysTray(); sysTray.createSysTray(mainwindowShell); //显示主窗口 mainwindowShell.open(); // 当窗体未被关闭时执行循环体内的代码 while (!mainwindowShell.isDisposed()) { // 如果未发生事件,通过sleep方法进行监视事件队列 if (!display.readAndDispatch()) display.sleep(); } } public void closeWindow(){ sysTray.trayDispose();// 释放托盘及其相关资源 // Display display =mainwindowShell.getDisplay(); // display.dispose();// 释放底层的资源 System.exit(1);//退出主程序 } } /** * 创建并管理系统托盘 * 在托盘图标上单击鼠标右键弹出托盘菜单,双击显示程序主界面,单击(左键)显示气泡提示文本 */ package com.digitalcontent.communication; /** * @author 廖龙龙 * * 2008-8-30 */ import org.eclipse.swt.SWT; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; 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.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolTip; import org.eclipse.swt.widgets.Tray; import org.eclipse.swt.widgets.TrayItem; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import java.util.Timer; import java.util.TimerTask; public class HookSysTray { private TrayItem trayItem;// 托盘项 private Image trayicon;// 托盘图标 //构造方法 public HookSysTray() { } /** * @param mainshell为主窗口对应的shell对象 */ public void createSysTray(final Shell mainshell) { trayItem = initTrayItem(mainshell);//初始化托盘 if (trayItem != null) { trayMinimize(mainshell);// 最小化主程序到系统托盘 } } /** * 初始化托盘项目的文字和图标 * @param mainShell 主程序窗口对象 */ private TrayItem initTrayItem(final Shell mainshell) { // 获取系统托盘 final Tray tray =mainshell.getDisplay().getSystemTray(); // 在某些平台上,可能不存在或不支持系统托盘。需检查当前的系统是否支持系统托盘。 if (tray == null) { System.out.println("当前系统不支持系统托盘"); return null; } //当系统支持系统托盘时 else { trayItem = new TrayItem(tray, SWT.NONE);// 创建托盘项 Display maindisplay = mainshell.getDisplay(); trayicon = new Image(maindisplay, "icons//19-1.bmp");// 创建托盘图像 trayItem.setImage(trayicon);// 设置托盘图标 // 添加托盘右键菜单 fillTrayItem(mainshell); // 鼠标放在托盘图标上时,显示的提示文本信息 trayItem.setToolTipText("廖龙龙"); // 显示托盘气泡提示文本 final ToolTip tip = new ToolTip(mainshell,SWT.BALLOON | SWT.ICON_INFORMATION); //自动隐藏气泡提示文本 tip.setAutoHide(true); //设置提示信息 tip.setMessage("3D数字内容产品开发"); tip.setText("欢迎使用"); trayItem.setToolTip(tip); //单击选中托盘图标的时候,显示气泡提示 trayItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { // 显示气泡提示 tip.setVisible(true); // 采用定时器,自动关闭气泡提示文本 final Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { // 非用户界面线程不能直接操作用户界面线程 // 要想在另外一个线程中尝试修改用户界面,应采用以下方法: mainshell.getDisplay().syncExec(new Runnable() { public void run() { // 数秒后处理气泡提示文本 // tip.setVisible(false);// 使当前气泡提示文本不可见 tip.setAutoHide(true);// 自动隐藏 // System.out.println("气泡提示文本消失了!"); } }); timer.cancel(); } }, 2 * 3 * 100); //单击托盘图标,图标不断闪烁 trayIconFlicker(mainshell); } }); // 双击托盘,显示程序主界面并恢复为正常大小 trayItem.addListener(SWT.DefaultSelection, new Listener() { public void handleEvent(Event event) { mainshell.setVisible(true); mainshell.setMinimized(false); } }); return trayItem; } } /** * 接收到新消息时,托盘图标闪烁 * @param minute 执行一次操作的时间间隔 * TODO 单击系统托盘图标,都会执行这个方法,导致图标的闪烁不断加快 * 考虑采用全局变量来实现计时器类final Timer timer */ private void trayIconFlicker(final Shell mainshell) { int minute=1;//执行一次操作的时间间隔 final Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { // 非用户界面线程不能直接操作用户界面线程 // 要想在另外一个线程中尝试修改用户界面,应采用以下方法: mainshell.getDisplay().syncExec(new Runnable() { public void run() { // 每个200ms间隔显示托盘图标,以实现图标闪烁的效果 trayItem.setImage(null);//设置托盘图标为空 try { Thread.sleep(200); } catch (InterruptedException e) { } trayItem.setImage(trayicon);//设置托盘图标 } }); } },0,minute * 6 * 100); } // 3. 接收到新消息的时候,自动弹出没有图标的消息提示框,26ms之后消失 /** * 最小化程序到托盘 * @param mainShell 主程序窗口对象 */ private void trayMinimize(final Shell mainShell) { mainShell.addShellListener(new ShellAdapter() { // 最小化时不显示在任务栏 public void shellIconified(ShellEvent e) { // 主程序窗口不可见 mainShell.setVisible(false); } }); //用户双击托盘图标,显示主程序窗口并恢复为正常大小 // trayItem.addListener(SWT.Selection, new Listener() { // public void handleEvent(Event event) { // if (mainShell.isVisible()==false) { // mainShell.setVisible(true); // mainShell.setMinimized(false); // } // } // }); } /** * 构造托盘菜单项 * @param mainShell 主程序窗口对象 */ private Menu fillTrayItem(final Shell mainshell) { final Menu menu = new Menu(mainshell, SWT.POP_UP); //主程序退出菜单项 final MenuItem exitItem = new MenuItem(menu, SWT.PUSH);//主程序退出菜单 exitItem.setText("退出程序"); exitItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { MessageBox box = new MessageBox(mainshell, SWT.YES | SWT.NO | SWT.ICON_QUESTION); box.setMessage("退出主程序?"); int response = box.open();//打开消息对话框 if (response == SWT.YES) { trayDispose();//释放托盘相关的资源 System.exit(1);//退出主程序 } } }); new MenuItem(menu, SWT.SEPARATOR);// 分割条 //平台开发者信息 final MenuItem authorItem = new MenuItem(menu, SWT.PUSH);// 开发者信息菜单 authorItem.setText("平台开发者"); authorItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { MessageBox box = new MessageBox(mainshell, SWT.OK); box.setMessage("该平台由廖龙龙设计并开发"); box.open(); } }); MenuItem menuItemMaximize = new MenuItem(menu, SWT.PUSH);// 窗口恢复菜单 menuItemMaximize.setText("恢复主窗口"); menuItemMaximize.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if (mainshell.isVisible() == false) { mainshell.setVisible(true); mainshell.setMinimized(false); } } }); MenuItem menuItemMinimize = new MenuItem(menu, SWT.PUSH);// 最小化菜单 menuItemMinimize.setText("最小化窗口到托盘"); menuItemMinimize.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { mainshell.setMinimized(true); } }); // 当前菜单项不可用时,显示为灰色 trayItem.addListener(SWT.MenuDetect, new Listener() { public void handleEvent(Event event) { menu.setVisible(true); if (mainshell.isVisible()) { menu.getItem(3).setEnabled(false); menu.getItem(4).setEnabled(true); } else if(mainshell.getMinimized()==true){ menu.getItem(3).setEnabled(true); menu.getItem(4).setEnabled(false); } } }); // 选中托盘图标并单击鼠标右键,显示托盘菜单项 // trayItem.addSelectionListener(new SelectionAdapter() { // public void widgetSelected(Event e) { // 使托盘菜单可见 // if ((menu.getVisible() == false) && (e.button == 3)) { // menu.setVisible(true); // } // } // }); return menu; } /** * 释放托盘及其相关资源 */ public void trayDispose() { // 释放系统托盘 if (trayItem != null) trayItem.dispose(); // 释放创建的图像资源(系统托盘图标) if (trayicon != null) { trayicon.dispose(); } } } |
|