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/...