`
qhdlgd110
  • 浏览: 9724 次
  • 性别: Icon_minigender_1
  • 来自: 威海
社区版块
存档分类
最新评论

SWT 中实现最小化到托盘图标

    博客分类:
  • swt
 
阅读更多
package com.unmi;

import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

/**
 * SWT 3.0 开始引入了 Tray,可以在系统栏放置你的程序图标了
 * 本程序实现的功能有四:
 * 1. 点击窗口的最小化或关闭按钮都是隐藏窗口--任务栏里不显示,不退出程序
 * 2. 窗口隐藏时,任务栏无图标,系统栏有图标;窗口处于显示状态时则恰好相反
 * 3. 窗口隐藏时可通过单击系统栏图标或点击系统栏的 "显示窗口" 菜单显示窗口
 * 4. 程序只能通过点击系统栏的 "退出程序" 菜单项退出,窗口的 X 按钮无效
 * @author Unmi
 *
 */
public class TrayExample {

    public static void main(String[] args) {
        Display display = new Display();
        
        //禁用掉了最大化按钮
        final Shell shell = new Shell(display,SWT.SHELL_TRIM ^ SWT.MAX);
        shell.setText("TrayExample");

        //取系统中预置的图标,省得测试运行时还得加个图标文件
        shell.setImage(display.getSystemImage(SWT.ICON_WORKING));

        //构造系统栏控件
        final Tray tray = display.getSystemTray();
        final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
        
        //程序启动时,窗口是显示的,所以系统栏图标隐藏
        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 event) {
                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);
            }
        });

        trayItem.setImage(shell.getImage());

        //注册窗口事件监听器
        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();
    }

    /**
     * 窗口是可见状态时,则隐藏窗口,同时把系统栏中图标删除
     * 窗口是隐藏状态时,则显示窗口,并且在系统栏中显示图标
     * @param shell 窗口
     * @param tray 系统栏图标控件
     */
    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();
        }
    }
    
    /**
     * 窗口居中显示
     * @param shell 要显示的窗口
     */
    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);
    }
}

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

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

分享到:
评论

相关推荐

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

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

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

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

    最小化到系统托盘java

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

    RCP系统托盘实现方法

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

    swt 隐藏显示任务栏核心

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

    Swing 实现系统托盘

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

    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