[JAVA]从零开始的“桌面宠物”之路(二):系统托盘与任务栏
2017-12-05 13:27
459 查看
>今天的目标
在Window系统下,打开QQ宠物,我们并不能再任务栏看到相关的窗口。这也很好理解,毕竟桌面宠物就相当于一个桌面挂件,如果这个挂件侵入到我们的工作区(任务栏),就很烦,也很影响工作效率:当我们需要在多个窗口中切换时,要把鼠标多略过一个“桌面宠物”的图标。
所以桌面宠物拥有一个独立的任务栏图标,显然不是一个合适的设计。但取消了任务栏,我该在哪退出这个宠物呢?其中一个方法是,右键宠物,弹出相关的控制内容,如:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/14/60826ac56dc215443a1df06be36a123d)
这个方法当然没有问题,但我们可能在工作时,需要桌面宠物完全隐藏到窗口外面去(类似360的悬浮球那种效果),省得占用我们的视窗空间。但这时就带来了一个问题,如何方便地找到这只宠物和进行相关控制(比如打开状态面板、喂食宠物、退出宠物等操作)。
QQ宠物是这么做的:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/14/991b3433d8f4d7bcdadef0d4f4365a57)
是的,通过把这些功能收拢到系统托盘里。
我们的今天的目标就是:隐藏任务栏图标并添加一个系统托盘图标。
>实现源码
由于没有什么大的难度,直接上代码了:
1.隐藏任务栏图标
对JFrame框体设置以下属性:
setType(JFrame.Type.UTILITY);
2.设置系统托盘
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();
}
}
}
测试运行,中文可能会显示为方块。这个其实不用太在意,打包成jar之后运行显示是正常的。如果在debug开发阶段十分介意这几个方块,给VM Options里加上-Dfile.encoding=gb18030,即可。
在Window系统下,打开QQ宠物,我们并不能再任务栏看到相关的窗口。这也很好理解,毕竟桌面宠物就相当于一个桌面挂件,如果这个挂件侵入到我们的工作区(任务栏),就很烦,也很影响工作效率:当我们需要在多个窗口中切换时,要把鼠标多略过一个“桌面宠物”的图标。
所以桌面宠物拥有一个独立的任务栏图标,显然不是一个合适的设计。但取消了任务栏,我该在哪退出这个宠物呢?其中一个方法是,右键宠物,弹出相关的控制内容,如:
这个方法当然没有问题,但我们可能在工作时,需要桌面宠物完全隐藏到窗口外面去(类似360的悬浮球那种效果),省得占用我们的视窗空间。但这时就带来了一个问题,如何方便地找到这只宠物和进行相关控制(比如打开状态面板、喂食宠物、退出宠物等操作)。
QQ宠物是这么做的:
是的,通过把这些功能收拢到系统托盘里。
我们的今天的目标就是:隐藏任务栏图标并添加一个系统托盘图标。
>实现源码
由于没有什么大的难度,直接上代码了:
1.隐藏任务栏图标
对JFrame框体设置以下属性:
setType(JFrame.Type.UTILITY);
2.设置系统托盘
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();
}
}
}
测试运行,中文可能会显示为方块。这个其实不用太在意,打包成jar之后运行显示是正常的。如果在debug开发阶段十分介意这几个方块,给VM Options里加上-Dfile.encoding=gb18030,即可。
相关文章推荐
- [JAVA]从零开始的“桌面宠物”之路(一):动画效果
- Java桌面软件最小化的系统托盘(SystemTray)
- Java桌面应用程序创建系统托盘图标
- 我的Java之路四:征兵系统
- java Swing 实现将系统最小化到系统托盘
- Java1.6.0实现调用操作平台桌面系统
- java中系统托盘的实现
- java系统托盘(代码)
- 黑马程序员 【】java学习之路——银行业务系统
- java swing 点击关闭按钮最小化到系统托盘的实现
- JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义
- java系统托盘的应用
- java系统托盘的应用
- java运用jni调用dll(含源码)实现屏蔽系统热键和任务栏
- java 动态获取当前系统桌面位置
- java的系统学习之路(一)
- JAVA实现系统托盘
- JAVA应用系统工具快捷托盘实例代码
- 想做数据科学家/工程师?从零开始系统规划大数据学习之路
- atitit.系统托盘图标的设计java swing c# .net c++ js