>今天的目标
在Window系统下,打开QQ宠物,我们并不能再任务栏看到相关的窗口。这也很好理解,毕竟桌面宠物就相当于一个桌面挂件,如果这个挂件侵入到我们的工作区(任务栏),就很烦,也很影响工作效率:当我们需要在多个窗口中切换时,要把鼠标多略过一个“桌面宠物”的图标。
所以桌面宠物拥有一个独立的任务栏图标,显然不是一个合适的设计。但取消了任务栏,我该在哪退出这个宠物呢?其中一个方法是,右键宠物,弹出相关的控制内容,如:
这个方法当然没有问题,但我们可能在工作时,需要桌面宠物完全隐藏到窗口外面去(类似360的悬浮球那种效果),省得占用我们的视窗空间。但这时就带来了一个问题,如何方便地找到这只宠物和进行相关控制(比如打开状态面板、喂食宠物、退出宠物等操作)。
QQ宠物是这么做的:
是的,通过把这些功能收拢到系统托盘里。
我们的今天的目标就是:隐藏任务栏图标并添加一个系统托盘图标。
>实现源码
由于没有什么大的难度,直接上代码了:
1.隐藏任务栏图标
对JFrame框体设置以下属性:
setType(JFrame.Type.UTILITY);
private void setTray(){ if(SystemTray.isSupported()){// 判断系统是否支持系统托盘 SystemTray tray = SystemTray.getSystemTray(); // 获取当前系统的托盘 // 为托盘添加一个右键弹出菜单 PopupMenu popMenu = new PopupMenu(); MenuItem itemOpen = new MenuItem("打开"); itmOpen.addActionListener(e -> System.out.println("打开")); MenuItem itemExit = new MenuItem("退出"); itmExit.addActionListener(e -> System.exit(0)); popMenu.add(itemOpen); popMenu.add(itemExit); // 设置托盘图标 ImageIcon icon = new ImageIcon("trayIcon.png"); Image image = icon.getImage().getScaledInstance(icon.getIconWidth(),icon.getIconHeight(), Image.SCALE_DEFAULT); TrayIcon trayIcon = new TrayIcon(image,"桌面宠物",popMenu); trayIcon.setImageAutoSize(true); // 自适应尺寸,这个属性至关重要 try { tray.add(trayIcon); } catch (AWTException e1) { e1.printStackTrace(); } } }