先看效果图:
一、关闭后最小化到任务栏
public class MainWindow extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
SystemTray systemTray;
TrayIcon trayIcon=null;
/**
* Create the frame.
*/
public MainWindow() {
this.setTitle("室内定位系统(IPS)服务端");
String iconpath="img/icon1.png";//任务栏图标,最小化窗口
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//关键,设定关闭窗口无操作,用于后面的窗体监听事件
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
int i=JOptionPane.showConfirmDialog(null, "确认要最小化窗口吗?", "最小化窗口", JOptionPane.OK_CANCEL_OPTION);
if(i==JOptionPane.OK_OPTION){
//System.exit(0);
dispose();
//获取默认的图片
iconImage=Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource(iconpath));
if (SystemTray.isSupported()) {// 判断系统是否支持系统托盘
if (systemTray==null) {
systemTray=SystemTray.getSystemTray();//创建系统托盘
if (trayIcon!=null) {
systemTray.remove(trayIcon);
}
}
//创建弹出式菜单
PopupMenu popup=new PopupMenu();
//主界面选项
MenuItem mainMenuItem=new MenuItem("主界面");
//mainMenuItem.setActionCommand("main menu");
mainMenuItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
setVisible(true);
//setAlwaysOnTop(true);
//systemTray.remove(trayIcon);
}
});
//退出程序选项
MenuItem exitMenuItem=new MenuItem("退出");
//exitMenuItem.setActionCommand("exit");
exitMenuItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//dispose();
System.exit(0);
}
});
popup.add(mainMenuItem);
//弹出式菜单添加分割线
popup.addSeparator();
popup.add(exitMenuItem);
//image=Toolkit.getDefaultToolkit().getImage("Img/ipsicon.png");
trayIcon=new TrayIcon(iconImage, "IPS", popup);//创建trayIcon
trayIcon.setImageAutoSize(true);
trayIcon.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
setVisible(true);
//setAlwaysOnTop(true);
//systemTray.remove(trayIcon);
}
});
try {
systemTray.add(trayIcon);
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
else{
return;
}
}
});
}
}
关键点有如下几条:
(1)窗体设置默认的关闭操作,在很多软件中为避免关闭按钮退出程序,会设定关闭最小化托盘的操作,如QQ;这里需设定关闭无操作,系统默认是直接退出程序。
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
(2)添加窗体关闭监听事件
this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){}});
(3)创建系统托盘和弹出式菜单,注释比较清楚不再说明。
二、窗体图标自定义
参考博文在Eclipse中JFrame自定义图标可以显示,但是导出JAR之后无法显示。
在JFrame的使用中,自定义的图标导出为jar可执行文件后,常常不显示,上面博客解决了该问题,最主要的是将图片资源要放在src目录下。
原因:在利用Fatjar导出时特意看了下打包文件,只有在src中才会自动添加进去;如果是根目录下,需要自己添加(该方式没验证)。
String imgpath="img/icon.png";//桌面图标
//String iconpath="img/icon1.png";//任务栏图标,最小化窗口
//-----------------------------------------------
imageIcon=Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource(imgpath));
//----------------------------------------------------------------
//image=Toolkit.getDefaultToolkit().getImage("/Img/ipsicon.png");
this.setIconImage(imageIcon);
关键是从src文件中获取图片资源:
imageIcon=Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource(imgpath));