java实现系统托盘示例

 更新时间:2014年03月07日 14:49:11   作者:  
桌面的系统托盘即当程序最小化或者关闭按钮程序并没有退出,而是最小化在任务状态区域,下面是使用java实现系统托盘示例

桌面的系统托盘即当程序最小化或者关闭按钮程序并没有退出,而是最小化在任务状态区域(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;
  }
 }
}

相关文章

  • Java分布式锁理论(redis、zookeeper))案例详解

    Java分布式锁理论(redis、zookeeper))案例详解

    zookeeper有个节点路径的概念,节点路径不能重复,保证了唯一性,这篇文章给大家介绍Java分布式锁理论(redis、zookeeper) 案例详解,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • 使用redisTemplate的scan方式删除批量key问题

    使用redisTemplate的scan方式删除批量key问题

    这篇文章主要介绍了使用redisTemplate的scan方式删除批量key问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • mybatis中的count()按条件查询方式

    mybatis中的count()按条件查询方式

    这篇文章主要介绍了mybatis中的count()按条件查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 基于SSM框架实现简单的登录注册的示例代码

    基于SSM框架实现简单的登录注册的示例代码

    这篇文章主要介绍了基于SSM框架实现简单的登录注册的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • IDEA2022搭建Spring Cloud多模块项目的详细过程

    IDEA2022搭建Spring Cloud多模块项目的详细过程

    这篇文章主要介绍了IDEA2022搭建Spring Cloud多模块项目,网上有很多教程父模块都是通过maven的方式创建的,然后子模块是通过Spring Initalizr方式创建,这种方式父模块无法管理子模块的依赖仲裁,需要每个子模块自行管理,就失去了父模块的用处了
    2022-10-10
  • elasticsearch索引创建create index集群matedata更新

    elasticsearch索引创建create index集群matedata更新

    这篇文章主要介绍了elasticsearch索引创建create index及集群matedata更新,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • SpringBoot 动态配置Profile环境的方式

    SpringBoot 动态配置Profile环境的方式

    这篇文章主要介绍了SpringBoot 动态配置Profile环境的方式,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • Spring Boot集成Mybatis的实例代码(简洁版)

    Spring Boot集成Mybatis的实例代码(简洁版)

    这篇文章主要介绍了Spring Boot集成Mybatis简洁版的教程,需要的朋友可以参考下
    2018-02-02
  • java 页面url传值中文乱码的解决方法

    java 页面url传值中文乱码的解决方法

    本节讲的是ajax 的URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码。
    2013-03-03
  • 详解Java中Period类的使用方法

    详解Java中Period类的使用方法

    Period类通过年、月、日相结合来描述一个时间量,最高精度是天。本文将通过示例详细为大家讲讲Period类的使用,需要的可以参考一下
    2022-05-05

最新评论