[JAVA]从零开始的“桌面宠物”之路(二):系统托盘与任务栏

>今天的目标

    在Window系统下,打开QQ宠物,我们并不能再任务栏看到相关的窗口。这也很好理解,毕竟桌面宠物就相当于一个桌面挂件,如果这个挂件侵入到我们的工作区(任务栏),就很烦,也很影响工作效率:当我们需要在多个窗口中切换时,要把鼠标多略过一个“桌面宠物”的图标。

    所以桌面宠物拥有一个独立的任务栏图标,显然不是一个合适的设计。但取消了任务栏,我该在哪退出这个宠物呢?其中一个方法是,右键宠物,弹出相关的控制内容,如:

 [JAVA]从零开始的“桌面宠物”之路(二):系统托盘与任务栏_第1张图片

     这个方法当然没有问题,但我们可能在工作时,需要桌面宠物完全隐藏到窗口外面去(类似360的悬浮球那种效果),省得占用我们的视窗空间。但这时就带来了一个问题,如何方便地找到这只宠物和进行相关控制(比如打开状态面板、喂食宠物、退出宠物等操作)。

     QQ宠物是这么做的:

[JAVA]从零开始的“桌面宠物”之路(二):系统托盘与任务栏_第2张图片

    是的,通过把这些功能收拢到系统托盘里。

    我们的今天的目标就是:隐藏任务栏图标并添加一个系统托盘图标。


>实现源码

    由于没有什么大的难度,直接上代码了:

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)