JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义

时间:2022-02-03 22:19:54

先看效果图:

JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义

一、关闭后最小化到任务栏

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中才会自动添加进去;如果是根目录下,需要自己添加(该方式没验证)。

JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义

                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));