您的位置:首页 > 编程语言 > Java开发

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

2016-12-30 13:42 761 查看
开始一点一点地加自己以前没试过的程序功能,这一次是实现了当点击关闭按钮的时候,程序自己最小化到系统托盘而不是退出。我也是从网上找了些程序来做参考,不过对有一些博文真的是无语了,连个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);
只需要在你需要显示气泡通知的时候调用,就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: