开始一点一点地加本身之前没试过的程序功能,这一次是实现了当点击关闭按钮的时候,程序本身最小化到系统托盘而不是退出。我也是从网上找了些程序来作参考,不过对有一些博文真的是无语了,连个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); 只须要在你须要显示气泡通知的时候调用,就能够了。