java swing 点击关闭按钮最小化到系统托盘的实现

开始一点一点地加自己以前没试过的程序功能,这一次是实现了当点击关闭按钮的时候,程序自己最小化到系统托盘而不是退出。我也是从网上找了些程序来做参考,不过对有一些博文真的是无语了,连个main函数都没有还敢说是自己亲自测试可行。唉,我应该说什么好呢?不想修改至少也得自己运行一下吧,省得误人子弟。
    好了,实现这个功能主要有几个地方:
    需要实现这个功能,需要两个类,一个是TrayIcon,一个是SystemTray类:
    private TrayIcon trayIcon;// 托盘图标
    private SystemTray systemTray;// 系统托盘

    然后通过这两个类,我自己封装了一个函数minimizeToTray,实现如下:
    public void minimizeToTray() {
try {
if (SystemTray.isSupported()) // 判断当前平台是否支持系统托盘
{
systemTray = SystemTray.getSystemTray();// 获得系统托盘的实例
URL path = BeiKeLogin.class.getResource("myicon.png");
System.out.println(path);
Image imgae = ImageIO.read(path); 
trayIcon = new TrayIcon(imgae);
systemTray.add(trayIcon);// 设置托盘的图标
trayIcon.addMouseListener(iconAdap);//为图标设置鼠标监听器
}
} catch (Exception ex) {
ex.printStackTrace();
}
    图标的监听器如下:
    MouseAdapter iconAdap = new MouseAdapter() {
public void mouseClicked(MouseEvent e){
            if(e.getClickCount() == 2 )//双击托盘窗口再现
                setExtendedState(Frame.NORMAL);
                setVisible(true);
}};

    再接下来,就是给窗体设置点击关闭按钮的时候,隐藏窗体。
    setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    并且添加“最小化到系统托盘”(实际上是释放掉窗体)的监听器:
    addWindowListener(winAdap);
    监听器winAdap的实现如下:
    WindowAdapter winAdap = new WindowAdapter() {
public void windowIconified(WindowEvent e){  
            dispose();//窗口最小化时dispose该窗口
        }  };


    大概就是这样,就可以实现了。下面再给个我参考的那个网上的程序吧:
import java.awt.AWTException;
import java.awt.Frame;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class Bounce extends JFrame{
    private TrayIcon trayIcon;//托盘图标 new
    private SystemTray systemTray;//系统托盘  //
        
    public Bounce()
    {
        super("系统托盘图标");
     SystemTray.isSupported();   //判断当前平台是否支持系统托盘
        systemTray = SystemTray.getSystemTray();//获得系统托盘的实例
        setSize(150,150);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                this.setVisible(true);   
        try {
            trayIcon = new TrayIcon(ImageIO.read(new File("main.png")));
            systemTray.add(trayIcon);//设置托盘的图标,0.gif与该类文件同一目录
        }
        catch (IOException e1) {e1.printStackTrace();}
        catch (AWTException e2) {e2.printStackTrace();}
       
        this.addWindowListener(
                new WindowAdapter(){  
                    public void windowIconified(WindowEvent e){  
                        dispose();//窗口最小化时dispose该窗口
                    }  
                });
       
        trayIcon.addMouseListener(
                new MouseAdapter(){
                    public void mouseClicked(MouseEvent e){
                        if(e.getClickCount() == 2)//双击托盘窗口再现
                            setExtendedState(Frame.NORMAL);
                            setVisible(true);
                    }
                });       
    }  
    public static void main(String args[])
    {
        new Bounce();
    }
}


注:
对于这个程序来说,我自己在调试的时候,下面这一句总是报出can't read input file的错。
trayIcon = new TrayIcon(ImageIO.read(new File("main.png")));
由于我用的是eclipse,在路径总是上与单独用命令行有点区别。可能在eclipse上通过了,导出成jar包又不行了。参考程序调用的是ImageIO.read(File)方法,这样在路径问题上很容易出毛病,所以我将这句话改了一下,就可以完美解决这个问题了(我采用的是ImageIO.read(URL)方法,如最上面我的程序实现方法):
URL path = BeiKeLogin.class.getResource("myicon.png"); //定义一个URL,并指向图片资源(BeiKeLogin为                                                        //我的程序的类名)
Image imgae = ImageIO.read(path); 
trayIcon = new TrayIcon(imgae);

这样一来,就可以完美得到解决了。

另外,最小化到系统托盘,可能我们还想做一个气泡的通知,我们只需要再加上这样一句话:
trayIcon.displayMessage("通知:", "程序最小化到系统托盘", TrayIcon.MessageType.INFO);
只需要在你需要显示气泡通知的时候调用,就可以了。

原文地址:https://www.cnblogs.com/hzcya1995/p/13317814.html