`

swt最小化到系統托盤的實現

    博客分类:
  • SWT
阅读更多

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

本段代码就是要完成这样的功能,是 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. 也是只能通过托盘图标的弹出菜单项“退出” 来关闭程序

 

原文地址:http://www.blogjava.net/Unmi/archive/2008/03/23/188040.html

 

分享到:
评论
1 楼 ningxiaofeng 2010-05-06  
呵呵,正是我需要的功能,谢谢

相关推荐

    最小化到系统托盘java

    ### 最小化到系统托盘Java实现解析 在日常软件开发过程中,经常会有将应用程序窗口最小化至系统托盘的需求,这种设计不仅节省了屏幕空间,还为用户提供了一种更为便捷的操作方式。本文将深入探讨如何使用Java实现这...

    java创建系统托盘实现(swt和jdk6分别实现)

    在Java编程中,有时我们需要创建一个系统托盘图标来提供应用程序的后台...总的来说,了解如何在不同环境下创建系统托盘图标对于开发跨平台的应用程序至关重要,这使得用户即使在应用程序最小化后也能轻松地与之交互。

    Swing 实现系统托盘

    在Java的Swing库中,实现系统托盘功能可以为应用程序提供一个持续的交互界面,即使主窗口已经最小化或关闭。系统托盘,也称为通知区域或系统通知区,通常位于操作系统任务栏的右侧,允许用户快速访问常用的功能或...

    RCP系统托盘实现方法

    RCP(Rich Client Platform)系统托盘实现方法主要涉及到如何将程序最小化到Windows操作系统的系统托盘区域,以便在不占用桌面空间的同时,让用户能够快速访问和控制应用程序。以下是一份详细的步骤介绍: 1. **...

    *此源码已更新并重新上传java swt 隐藏和显示任务栏图标和托盘图标

    在实际项目中,使用SWT进行这类操作可以提升用户体验,允许用户在不关闭应用程序的情况下将其最小化到系统托盘,从而节省任务栏空间。此外,通过控制图标可见性,可以实现如后台运行、定时提醒等高级功能。对于...

    swt 隐藏显示任务栏核心

    SWT 3.0 开始引入了 Tray,可以在系统栏放置你的程序图标了 本程序实现的功能有四: * 1. 点击窗口的最小化或关闭按钮都是隐藏窗口--任务栏里不显示,不退出程序 * 2. 窗口隐藏时,任务栏无图标,系统栏有图标;...

    Eclipse_Swt_Jface_核心应用_部分19

    6.4.3 显示“最大化/最小化”按钮 85 6.4.4 设置选项卡的颜色和背景图片 85 6.4.5 仿Eclipse编辑区的选项卡 87 6.4.6 限制选项卡文字的长度 90 6.4.7 设置右上角控件 91 6.4.8 自定义选项的常用方法 91 ...

    jdic的插件

    3. **Java系统托盘** - JDIC支持在操作系统任务栏中创建系统托盘图标,允许用户在不关闭应用的情况下最小化它。 4. **JDIC调用或者整合本地桌面环境的组件或应用程序** - 表示JDIC可以访问并利用操作系统级别的特性...

Global site tag (gtag.js) - Google Analytics