最近用java swing仿写QQ,想实现QQ图标显示在系统托盘的效果。研究了一下。废话不多说,进入正题。
首先定义窗体:
//初始化窗体
JFrame frame=new JFrame("My QQ");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
ImageIcon img=new ImageIcon(Demo.class.getClassLoader().getResource("res/images/logo.gif"));
frame.setIconImage(img.getImage());
窗体建好了,准备添加系统托盘图标
//得到当前系统托盘
SystemTray systemtray = SystemTray.getSystemTray();
//创建带指定图像、工具提示和弹出菜单的 TrayIcon
TrayIcon trayicon=new TrayIcon(img.getImage(),"My QQ",pm);
//将TrayIcon添加到系统托盘
try {
systemtray.add(trayicon);
} catch (AWTException e1) {
e1.printStackTrace();
}
但在添加系统托盘图标前还要先定义一下弹出菜单
//定义弹出菜单
PopupMenu pm=new PopupMenu();
//定义弹出菜单项
MenuItem openmenu = new MenuItem("打开主面板");
MenuItem closemenu = new MenuItem("退出MyQQ");
MenuItem online = new MenuItem("我在线上");
MenuItem busy = new MenuItem("忙碌");
MenuItem invisible= new MenuItem("隐身");
//添加弹出菜单项到弹出菜单
pm.add(openmenu);
pm.add(closemenu);
pm.add(online);
pm.add(busy);
pm.add(invisible);
现在来看看效果吧!
已经再系统托盘上显示了My QQ的图标了,现在在图标上点击鼠标右键试试,是否能看到有菜单弹出呢?。不过这时鼠标左键还不用用,鉴于一般都是点击鼠标左键显示窗体,下面为TrayIcon添加鼠标监听器。
//为trayicon添加鼠标监听器
trayicon.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
//鼠标左键点击,设置窗体状态,正常显示
if(e.getButton()==MouseEvent.BUTTON1){
frame.setExtendedState(JFrame.NORMAL);
}
}
});
现在最小化窗体,鼠标左键点击托盘图标已经可以显示窗体了。但是除了系统托盘外,该程序还在任务栏有显示,看着总是不爽,那么再加上一句
frame.setType(Window.Type.UTILITY);
终于该程序没有在任务栏显示了,再运行下窗体,好像貌似最小/大化图标没有了,呃,,,
可以去掉窗体装饰,自定义按钮,或者不去任务栏图标吧
frame.setUndecorated(true);
去掉任务栏显示后,又发现单击鼠标左键不管用了,呃,,一波未平一波又起。。
试试在trayicon监听器里加上frame.setVisible(true);试试吧
//设置单击击系统托盘图标显示主窗口
trayicon.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
//鼠标左键点击,设置窗体状态,正常显示
if(e.getButton()==MouseEvent.BUTTON1){
frame.setExtendedState(JFrame.NORMAL);
frame.setVisible(true);
}
}
});
到这里已经成功添加了系统托盘图标,不过托盘图标的弹出菜单PopupMenu貌似加不上图标,而TrayIcon又不支持JPopupMenu。 。
下次再介绍怎么在系统托盘的弹出菜单上加图标吧