Java做的应用程序,过去要在win平台上实现最小化时在系统托盘区域产生一个图标,必须得用JNI调用OS的库函数才行。但是在JDK6中,终于加入了相应的API。不多说,例子如下:
import java.awt.AWTException; import java.awt.Image; import java.awt.SystemTray; import java.awt.TrayIcon; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class MinExp extends JFrame { /** * Declare private variables */ private JButton testBtn; private SystemTray systemTray; private Image icon; private TrayIcon trayIcon; private JPanel backGroud; /** * Constructor */ public MinExp() { testBtn = new JButton("Minimize"); backGroud = new JPanel(); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(200, 200); testBtn.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent evt) { setExtendedState(JFrame.ICONIFIED); dispose(); systemTray= SystemTray.getSystemTray(); try{ icon = new ImageIcon(this.getClass().getClassLoader().getResource("world.jpg")).getImage(); trayIcon = new TrayIcon(icon, "WorldClock"); systemTray.add(trayIcon); }catch(AWTException e) { e.printStackTrace(); } trayIcon.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { setExtendedState(JFrame.NORMAL); systemTray.remove(trayIcon); } setVisible(true); } }); } }); backGroud.add(testBtn); this.add(backGroud); } public static void main(String[] args) { MinExp mep = new MinExp(); mep.setVisible(true); } } |
TrayIcon就是新加的托盘图标类。
在mouseClicked事件处理中,首先将原窗口给销毁掉,取得当前OS的系统托盘区域的实例systemTray.
创建新的TrayIcon,然后把该TrayIcon加到systemTray中去。
同时给这个TrayIcon加上事件侦听,一旦被click,设置原窗口正常化,并把该图标从系统托盘区域去除。
关键词:TrayIcon, systemTray, ImageIcon.
PS: 在生成图标的时候,PATH一定要注意。这里用this.getClass().getClassLoader().getResource()去jar的根目录寻找。
目录结构:
jar ---- image.JPG
---- com/zrc/...