Swing 窗口的最小化到系统图标与还原
2014年2月26日 13:01:47
一个上午的功夫,终于折腾好了。
上午主要是卡在监听事件的参数问题。当时脑子不好使,忘记事件是自己构造的,傻傻的测试了半天,如何传递窗口的参数
等中午解决的时候,又卡在系统托盘图标无法移除。 最后找到原因,最小化的代码摘抄之网络上,但是该代码的 执行逻辑有问题,再调整以后,总算变好。源代码中的移除时 对象为null,导致问题。调整对象创建的顺序即可解决。
设置窗体的图标时,网络上推荐:本人测试无法使用。一直为空
URL url = this.getClass().getResource("/images/01.jpg"); Image img = Toolkit.getDefaultToolkit().getImage(url); this.setIconImage(img);
实际中:可以使用
Image img = Toolkit.getDefaultToolkit().getImage("c:/1.jpg"); this.setIconImage(img);
##########################3
2014年2月26日 14:47:54 图形界面做好了,测试OK。
讲几点文章开头的问题和收获
实现系统托盘的功能代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// TODO Auto-generated method stub // 窗口最小化时执行 this.setVisible(false); TrayIcon trayIcon = null; SystemTray tray = null; if (SystemTray.isSupported()) // 判断系统是否支持系统托盘 { tray = SystemTray.getSystemTray(); // 创建系统托盘 Image image = Toolkit.getDefaultToolkit().getImage("./config/1.jpg");// 载入图片,这里要写你的图标路径哦 // 创建弹出菜单 PopupMenu popup = new PopupMenu(); // 主界面选项 MenuItem mainFrameItem = new MenuItem("主界面"); // 退出程序选项 MenuItem exitItem = new MenuItem("退出程序"); trayIcon = new TrayIcon(image, "SdS", popup);// 创建trayIcon trayIcon.setImageAutoSize(true);//自动设置图片大小 // 主界面执行的事件,回复窗口 ActionListener listener = new ShowJF(this, tray, trayIcon); mainFrameItem.addActionListener(listener); exitItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (JOptionPane.showConfirmDialog(null, "确定退出系统") == 0) { Runtime run = Runtime.getRuntime(); try { run.exec("taskkill /im SdsServer.exe /f /t"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.exit(0); } } }); popup.add(mainFrameItem); popup.add(exitItem); trayIcon.addActionListener(listener); try { tray.add(trayIcon); } catch (AWTException e1) { e1.printStackTrace(); } } }
双击托盘的事件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package cn.wuwenfu.swing; import java.awt.Frame; import java.awt.SystemTray; import java.awt.TrayIcon; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; public class ShowJF implements ActionListener{ private JFrame jf; private SystemTray st; private TrayIcon ti; public ShowJF(JFrame jf,SystemTray st,TrayIcon ti){ this.jf=jf; this.st=st; this.ti=ti; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jf.setVisible(true); st.remove(ti); jf.setExtendedState(Frame.NORMAL); //恢复窗口时自动弹出,否则只能在任务栏显示 } }
在事件中有一个remove方法,我之前的遇到的问题是:调用这个remove方法时,传递的对象TrayIcon是空。所以屡屡报错。
另外一个就是问题: setVisible方法,只能保证程序显示在任务栏,没有弹出主界面。 所以必须添加一个setExtendedState方法
第三个问题:窗体图标的问题,网络的方法报错,省去URL反而可行。 原因未明。
问题的解决,也就是我今天的收获。
QQ:540045865
热爱生活,热爱编程。