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

本段代码就是要完成这样的功能,是 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. 设备控制接口(ioctl 函数)
  2. pythonresponse对象的属性_Scrapy中response属性以及内容提取
  3. 本人计划继续写飞鸽传书,支持的人有吗?
  4. 计算机工程与应用 网站,计算机工程与应用杂志
  5. Interesting Finds: 2008.04.06
  6. 数据科学Python库01:Pandas
  7. 07_游戏破解器与文件加解密
  8. Euclid 欧几里得算法(c语言递归版)
  9. python笔记本好_如何使用 Python 分析笔记本电脑上的 100 GB 数据
  10. 作为一名APP开发者,你更Care什么?
  11. 导数,偏导数,方向导数,梯度的理解---微积分数学基础
  12. 和Windows10的垃圾“照片”说再见,找回“Windows照片查看器”
  13. C语言中函数的一些基本内容
  14. 倚天摘星:四季度反复筑底成为定局!
  15. cool edit pro生成2.7khz_0dB音源方法
  16. CSS Grid 布局
  17. Clothoid回旋曲线在APA路径优化中的工程应用实例及其C++源码分析与下载
  18. 软考初级程序员下午题题库
  19. C++学习小结 类与对象
  20. AI 图片截取、ffmpeg使用及安装, anaconda环境,图片标注(labelme),模型训练(yolov5),CUDA+Pytorch安装及版本相关问题

热门文章

  1. Dom解析与Sax解析的区别
  2. 百度黄埔学院将培养一批首席AI架构师,为“国之重器”赋能
  3. 微擎数据库表结构,供参考!
  4. java下载文件名称各种浏览器兼容问题
  5. kafka 自动与手动管理offset
  6. 计算机打字没打完,电脑打字打不出来,详细教您电脑打字打不出来怎么解决
  7. 試試看寫博客 留著參考用
  8. 公司新年第一次全员大会小记
  9. Python函数day12
  10. 时钟BUFFER 介绍 核芯CLB53156 替代SI53156国产替代