先看效果图:
一、关闭后最小化到任务栏
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));