欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现系统托盘示例

程序员文章站 2024-02-26 13:32:46
桌面的系统托盘即当程序最小化或者关闭按钮程序并没有退出,而是最小化在任务状态区域(windows系统),当鼠标点击那个区域所在的图标有提示以及其他的操作。在 microso...

桌面的系统托盘即当程序最小化或者关闭按钮程序并没有退出,而是最小化在任务状态区域(windows系统),当鼠标点击那个区域所在的图标有提示以及其他的操作。在 microsoft windows 上,它被称为“任务栏状态区域 (taskbar status area)”,在 gnome 上,它被称为“通知区域 (notification area)”,在 kde 上,它被成为“系统托盘 (system tray)”。系统托盘由运行在桌面上的所有应用程序共享。
jdk1.6 中新增了两个类来实现:
systemtray和 trayicon,以下为详细介绍:

systemtray
类介绍:
在某些平台上,可能不存在或不支持系统托盘,所以要首先使用systemtray.issupported()来检查当前的系统是否支持系统托盘

systemtray可以包含一个或多个 trayicon,可以使用 add(java.awt.trayicon)方法将它们添加到托盘,当不再需要托盘时,使用 remove(java.awt.trayicon)
移除它。

trayicon由图像、弹出菜单和一组相关侦听器组成。每个 java 应用程序都有一个 systemtray实例,在应用程序运行时,它允许应用程序与桌面系统托盘建立连接。
systemtray实例可以通过getsystemtray ()方法获得。应用程序不能创建自己的 systemtray

复制代码 代码如下:

import java.awt.awtexception;
import java.awt.menuitem;
import java.awt.popupmenu;
import java.awt.systemtray;
import java.awt.trayicon;
import java.awt.event.actionevent;
import java.awt.event.actionlistener;
import java.awt.event.mouseadapter;
import java.awt.event.mouseevent;
import java.awt.event.windowevent;
import java.awt.event.windowstatelistener;

import javax.swing.imageicon;
import javax.swing.jbutton;
import javax.swing.jframe;
import javax.swing.jlabel;
import javax.swing.joptionpane;
import javax.swing.jpanel;
import javax.swing.timer;
import javax.swing.uimanager;

/**
 *
 * @author mr.liutao
 */
public class traybyjdk extends jframe implements actionlistener{

    private jpanel pane = null;
    private jbutton button = null; // 启动托盘图标的按钮
    private jlabel label = null; // 用来显示系统是否支持托盘的信息
    private trayicon trayicon = null; // 托盘图标
    private timer shanshuo = null;
    private imageicon icon1 = null;
    private imageicon icon2 = null;
    private systemtray tray = null; // 本操作系统托盘的实例
    boolean gengai = false;
    //采用jdk1.6的托盘技术 实现跨平台的应用
    public traybyjdk() {
        //super("托盘技术演示");
        icon1 = new imageicon("g:\\javaworks\\eclipsework\\山寨qqclient\\images\\16.gif"); // 将要显示到托盘中的图标
        icon2 = new imageicon("g:\\javaworks\\eclipsework\\山寨qqclient\\images\\15.gif"); // 将要显示到托盘中的图标
        try {
            // 将lookandfeel设置成windows样式
            uimanager.setlookandfeel("com.sun.java.swing.plaf.windows.windowslookandfeel");
        } catch (exception ex) {
            ex.printstacktrace();
        }
        pane = new jpanel();
        button = new jbutton("缩小到托盘");
        button.setenabled(false);
        label = new jlabel("本操作系统不支持托盘");
        pane.add(label);
        pane.add(button);
        //判断是否支持托盘
        if (systemtray.issupported()) {
            this.tray();
        }
        shanshuo = new timer(1000,this);
        shanshuo.start();
        this.getcontentpane().add(pane);
        this.setdefaultcloseoperation(jframe.exit_on_close);
        this.setsize(300, 200);
        this.addwindowstatelistener(new windowstatelistener () {
   public void windowstatechanged(windowevent state) {
    if(state.getnewstate() == 1 || state.getnewstate() == 7) {
     yinca();
    }
   }
  });

        this.setvisible(false);
        system.out.println("=============="+this.isvisible());
    }

    /**
     * 托盘相关代码
     */
    private void tray() {
        label.settext("本操作系统支持托盘");
        button.setenabled(true);
        tray = systemtray.getsystemtray(); // 获得本操作系统托盘的实例
        //imageicon icon = new imageicon("tray.gif"); // 将要显示到托盘中的图标
        popupmenu pop = new popupmenu(); // 构造一个右键弹出式菜单
        menuitem show = new menuitem("显示窗口");
        menuitem exit = new menuitem("退出演示");
        menuitem author = new menuitem("author");      
        /**
         * trayicon有三个构造
         * trayicon(image image) 用“图标”来构造
         * trayicon(image image, string tooltip) 用“图标”和“tooltip”构造
         * trayicon(image image, string tooltip, popupmenu popup) 用“图标”,“tooltip”,“弹出菜单”来构造一个托盘图标
         */
        trayicon = new trayicon(icon1.getimage(), "托盘技术演示", pop);
        // 点击本按钮后窗口被关闭,托盘图标被添加到系统的托盘中
        button.addactionlistener(new actionlistener() {

            public void actionperformed(actionevent e) {

                try {
                    tray.add(trayicon); // 将托盘图标添加到系统的托盘实例中
                    setvisible(false); // 使窗口不可视
                } catch (awtexception ex) {
                    ex.printstacktrace();
                }
            }
        });
        /**
         * 添加鼠标监听器,当鼠标在托盘图标上双击时,默认显示窗口
         */
        trayicon.addmouselistener(new mouseadapter() {

            public void mouseclicked(mouseevent e) {
                if (e.getclickcount() == 2) { // 鼠标双击
                    tray.remove(trayicon); // 从系统的托盘实例中移除托盘图标
                    setvisible(true); // 显示窗口
                }
            }
        });
        show.addactionlistener(new actionlistener() { // 点击“显示窗口”菜单后将窗口显示出来

            public void actionperformed(actionevent e) {
                tray.remove(trayicon); // 从系统的托盘实例中移除托盘图标
                setvisible(true); // 显示窗口
            }
        });
        exit.addactionlistener(new actionlistener() { // 点击“退出演示”菜单后推出程序

            public void actionperformed(actionevent e) {
                system.exit(0); // 退出程序
            }
        });
        author.addactionlistener(new actionlistener() { // 点击“退出演示”菜单后推出程序

            public void actionperformed(actionevent e) {
                showmessage();
            }
        });
        pop.add(show);
        pop.add(exit);
        pop.add(author);
    }
    /**
     * 显示信息
     */
    private void showmessage() {
        joptionpane.showmessagedialog(this, new jlabel("这是一个系统托盘"), "消息", joptionpane.information_message);
    }
    public static void main(string[] args) {
        new traybyjdk().yinca();
    }
    public void yinca(){
      try {
   tray.add(trayicon);
  } catch (awtexception e) {
   // todo auto-generated catch block
   e.printstacktrace();
  } // 将托盘图标添加到系统的托盘实例中
         setvisible(false); // 使窗口不可视
    }
 @override
 public void actionperformed(actionevent arg0) {
  if(!gengai){
   trayicon.setimage(icon2.getimage());
   gengai = true;
  }else{
   trayicon.setimage(icon1.getimage());
   gengai = false;
  }
 }
}