我们有些程序会想要托盘处显示图标,最小化到系统栏;关闭按钮不关闭程序,也是最小化到系统栏;点击托盘图标激活窗口,通过托盘图标的弹出菜单来退出程序。

本段代码就是要完成这样的功能,是 SWT  来实现的。

直接代码给出,代码中有较详细的注释,说明了本程序的功能及实现。文中的任务栏和系统栏应该知道是指哪一段吧,微软就是这么定义的,用 spyxx 的 findwindow 窥探一下就知道了。

package tray;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;
public class TrayApp {
public static void main(String[] args) {
Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("最小化到系統托盤");
//取消系統中預設的圖標,預設圖標在托盤不能顯示
shell.setImage(display.getSystemImage(SWT.ICON_INFORMATION));
//構建系統托盤
final Tray tray = display.getSystemTray();
final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
//設置在托盤中顯示的程序圖標
trayItem.setImage(display.getSystemImage(SWT.ICON_INFORMATION));
//程序啟動時,窗口是顯示的,所以托盤圖標隱藏
trayItem.setVisible(false);
trayItem.setToolTipText(shell.getText());
trayItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
toggleDisplay(shell, tray);
}
});
final Menu trayMenu = new Menu(shell, SWT.POP_UP);
MenuItem showMenuItem = new MenuItem(trayMenu, SWT.PUSH);
showMenuItem.setText("顯示窗口(&s)");
//顯示窗口,并隱藏托盤圖標
showMenuItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
toggleDisplay(shell, tray);
}
});
trayMenu.setDefaultItem(showMenuItem);
new MenuItem(trayMenu, SWT.SEPARATOR);
//托盤中的退出菜單,程式只能通過這個菜單退出
MenuItem exitMenuItem = new MenuItem(trayMenu, SWT.PUSH);
exitMenuItem.setText("退出程式(&x)");
exitMenuItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
shell.dispose();
}
});
//在托盤圖標點擊鼠標右鍵時的事件,彈出系統菜單
trayItem.addMenuDetectListener(new MenuDetectListener() {
public void menuDetected(MenuDetectEvent e) {
trayMenu.setVisible(true);
}
});
//注冊窗口監聽
shell.addShellListener(new ShellAdapter() {
//點擊窗口最小化按鈕時,窗口隱藏,托盤中顯示圖標
public void shellIconified(ShellEvent e) {
toggleDisplay(shell, tray);
}
//點擊窗口關閉時,并不終止程序,而是隱藏窗口,同時托盤中顯示圖標
public void shellClosed(ShellEvent e) {
e.doit = false;    //取消關閉操作
toggleDisplay(shell, tray);
}
});
shell.setSize(320, 240);
center(shell);
shell.open();
while(!shell.isDisposed()) {
if(!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
/**
* 窗口是可見狀態時,則隱藏窗口,在托盤中顯示程序圖標
* 窗口是隱藏狀態時,則顯示窗口,將托盤中圖標刪除
*/
private static void toggleDisplay(Shell shell, Tray tray) {
try {
shell.setVisible(!shell.isVisible());           //控制窗口顯示
tray.getItem(0).setVisible(!shell.isVisible()); //控制托盤圖標顯示
//如果窗口是顯示狀態
if(shell.getVisible()) {
shell.setMinimized(false);  //阻止窗口最小化
shell.setActive();          //激活窗口
}
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* 窗口居中顯示
*/
private static void center(Shell shell) {
Monitor monitor = shell.getMonitor();
Rectangle bounds = monitor.getBounds();
Rectangle rect = shell.getBounds();
int x = bounds.x + (bounds.width - rect.width)/2;
int y = bounds.y + (bounds.height - rect.height)/2;
shell.setLocation(x, y);
}
}

实现效果如下:

  

左图是窗口显示时,系统栏中无图标,而任务栏中有图标。右图是窗口隐藏时,只有系统栏有图标。

过后,看了翻译软件 LINGOES 灵格斯的表现形式是:

1. 任何时候系统栏都有图标
2. 最小化按钮不会隐藏窗口,只是最小化到任务栏
3. 关闭按钮也是不会关闭程序,而是最小化到系统栏
4. 也是只能通过托盘图标的弹出菜单项“退出” 来关闭程序

swt最小化到系統托盤的實現相关推荐

  1. java swt最小化到托盘_SWT 中实现最小化到托盘图标,并只能通过托盘的弹出菜单关闭程序...

    package com.unmi; import org.eclipse.swt.*; import org.eclipse.swt.events.*; import org.eclipse.swt. ...

  2. 認識系統服務 daemons

    認識系統服務 daemons 切換解析度為 800x600 最近更新日期:2005/10/12 在 Unix-Like 的系統中,常常聽到這個字眼: daemons !那麼什麼是傳說中的 daemon ...

  3. linux安装定制添加输入,Arch Linux--定制自己的Linux操作系統(乙-國際化桌面安裝篇)...

    Arch Linux--定制自己的Linux操作系統 ----乙-國際化&桌面安裝篇 相信大家看了<甲-安裝篇>之後,Arch Linux系統已經可以正常運行了吧?不過,Arch ...

  4. [VC++]最小化图标至托盘中

     经常都会看到最小化程序后就会在任务栏的托盘中保留一个小图标,即把窗口最小化至托盘中.实现起来很简单,只要明白它使用到的结构和一个Shell函数即可完成.但是如果要制作其他的菜单,需要另外制作,今天暂 ...

  5. 八字易经算法之用JAVA实现完整排盘系统_八字易經演算法之用JAVA實現完整排盤系統 | 學步園...

    去年一天,一個朋友去看望病人回來就驚奇的告訴我,他發現和他朋友一起住院(肝膽科)的病人無一例外都是屬相為虎的病人,不是大一輪就是小一輪的.這是為什麼呢? 這不是什麼偶然,也不是什麼巧合.也許通過八字能 ...

  6. easyuefi添加linux分区,linux學習筆記(一)——使用easyBCD或easyUEFI引導從硬盤安裝Ubuntu系統...

    Table of Contents windows系統安裝ubuntu會出現引導問題,windows系統不希望有其他系統和windows系統共存.所以我們得自己作一個引導.接下來主要介紹兩種引導,ea ...

  7. java swing 最小化到托盘_用Java实现程序最小化到托盘区

    我在程序中实测必须是16*16的图片才行 下面的这个程序简单地实现了把Java应用程序缩小到托盘的方法. 程序运行的jdk要是1.6才行,因为这是J2SDK1.6新加的一些类和方法. import j ...

  8. linux中改localhome名称,修改 /var/lib/locales/supported.d/local 文件(使用 locale -a 命令查看系統中所有已配置的 locale)...

    C 和 C++ 的標准庫分別有自己的 locale 操作方法,C 標准庫的 locale 設定函數是 setlocale(),而 C++ 標准庫有 locale 類和流對象的 imbue() 方法.這 ...

  9. 為Raspberry Pi 安裝Raspbian系統的詳細步驟 (Mac OS版本)

    Raspberry Pi作為一款ARM微型電腦板(Single-board computer),就離不開安裝作業系統(OS),樹莓派基金會(Raspberry Pi Foundation)提供了數款L ...

最新文章

  1. centos7挂载windows共享文件夹
  2. 鼠标取点——ginput()和getpts()详解
  3. ABAP事物码SFW5里business function前面的双箭头图标是什么含义
  4. mysql load character_mysql load data Invalid utf8mb4 character string: ”
  5. rtmp/rtsp/hls公网真正可用的测试地址
  6. python文件夹中的__init__.py的作用
  7. php自定义函数指定参数类型,php – Doctrine:如何添加带可选参数的自定义函数?...
  8. Mac安装Lingo
  9. Code-NFine:NFine权限控制
  10. Maven安装与配置
  11. 《大数据技术原理与应用》 期末复习
  12. 下载MDK5 Software Packs导入Keil5
  13. 记一次springboot应用偶发502错误的排查过程
  14. 基于Python通过Chrome的Cookie登录百度账户
  15. c++基本语法入门小游戏
  16. QT5 隐藏系统标题栏,自己编写个性靓丽标题栏
  17. Ubuntu必备软件
  18. Termux设置——服务自启动
  19. 关于两个正态总体均值差μ1-μ2的置信区间
  20. 算法拾遗三十一马拉车算法

热门文章

  1. Altium Designer--如何走蛇形线
  2. 如何修改wincc服务器画面,wincc画面怎么调大
  3. centos 7 systemctl restart network失败处理
  4. 三国志战略版鸿蒙梦魇,三国志战略版:陆抗版诸葛亮,低智队的梦魇!
  5. 【基础入门题010】互质勾股数组
  6. Sql - 查询工资第二高的记录.
  7. elasticsearch踩坑记录 no handler found for uri [http://localhost:9200/hyy/user/_search] and method [POST
  8. 如何修改PPT文档的原标题和作者信息
  9. Python函数day12
  10. JAVA编写一个telephone_1、 编写一个Java程序,程序中有一个类Telephone, Telephone类中包括有电话品牌、...