• 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);
    只需要在你需要显示气泡通知的时候调用,就可以了。

  • 相关阅读:
    C语言中的字符串处理库函数介绍与实现
    尾声,毕业设计答辩
    《算法图解》第六章笔记_广度优先搜索
    《算法图解》第五章笔记与课后练习_散列函数与散列表
    《算法图解》第四章笔记与课后练习_快速排序算法
    《算法图解》第三章笔记与课后练习_递归
    c# 执行javascript 脚本
    HttpWebRequest出错 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF
    秒转换成时分秒
    SQL2008中Merge的用法
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317814.html
Copyright © 2020-2023  润新知