问题回顾
在我的这篇文章中windows设置关闭显示器时间软件源起,我讲述了我开发编写一个控制windiows操作系统关闭显示器的事情以及结果。但是上篇文章的程序我是很不满意的,在上篇文章的展望中,我也把使用问题提出来了,下面再分析一下这些问题。
主要使用问题就是无法方便的看到当前关闭显示器的时间,没有可视化功能。由于没有可视化功能,我使用上篇文章的程序无法方便的看到当前系统关闭显示器时间是多少,程序的逻辑是如果当前关闭显示器时间是长亮就改为1分钟,如果是1分钟就改为长亮,所以操作的时候,如果不是很确定当前关闭显示器时间的状态信息,就处于莽操的状态,有时候第二天来了,发现显示器还是长亮。因此,我希望我能看到方便的看到当前关闭显示器时间状态信息,然后根据状态信息来进行操作。
调研
我想方便看到当前系统关闭显示器,有什么办法可以实现呢?写一个窗口一直悬浮在屏幕上,或者一直驻留在windows右下角通知栏,这两种方式是我想到的可以方便的看到的形式。我选择驻留在widnows右下角通知栏方式来实现。在编码领域有很多的GUI框架和编程语言能实现,但是无奈才疏学浅,选择了Java,毕竟这门语言是学习了以后,工作上一直使用并且一直实践的。
java swing提供了SystemTray这个类,使用这个类可以方便在windows右下角通知栏创建一个通知栏程序。
代码实现
通过网上的代码实现一个简单的右下角通知栏图标
package com.codelink;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
import java.util.Locale;
public class MoitorTimeMainApplicationDemo {
public static void main(String[] args) {
Locale.setDefault(Locale.CHINESE);
//adding TrayIcon.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
if (!SystemTray.isSupported()) {
showNoSupportDialog();
return;
}
final TrayIcon trayIcon = new TrayIcon(createImage("images/bulb.gif", "tray icon"));
final SystemTray tray = SystemTray.getSystemTray();
trayIcon.setImageAutoSize(false);
// Create a popup menu components
MenuItem aboutItem = new MenuItem("关于软件");
//MenuItem runStartUpItem = new MenuItem("开机启动");
CheckboxMenuItem runStartUpItem = new CheckboxMenuItem("开机启动");
Menu displayMenu = new Menu("关闭显示器时间");
MenuItem oneMintune = new MenuItem("1分钟");
MenuItem never = new MenuItem("永不");
MenuItem exitItem = new MenuItem("退出");
final PopupMenu popup = new PopupMenu();
//Add components to popup menu
popup.add(aboutItem);
popup.addSeparator();
popup.add(runStartUpItem);
popup.add(displayMenu);
displayMenu.add(oneMintune);
displayMenu.add(never);
popup.add(exitItem);
trayIcon.setPopupMenu(popup);
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.out.println("TrayIcon could not be added.");
}
}
protected static Image createImage(String path, String description) {
URL imageURL = MoitorTimeMainApplicationDemo.class.getClassLoader().getResource(path);
if (imageURL == null) {
System.err.println("Resource not found: " + path);
return null;
} else {
return (new ImageIcon(imageURL, description)).getImage();
}
}
private static void showNoSupportDialog() {
JOptionPane.showMessageDialog(null,
"你的电脑系统不支持系统通知栏!!!");
}
}
在上述代码中,实现了一个这样的右下角通知栏gui小程序。这样就可以了,我在这个通知栏程序上加了一些事件,鼠标悬浮到通知栏上的时候,显示windows系统当前关闭显示器时间。鼠标点击1分钟的时候,设置系统关闭显示器时间为1分钟。点击当前永不,设置当前关闭显示器时间为长亮。
设置鼠标悬浮效果
public static void initTrayIconToolTip(TrayIcon trayIcon) {
String moitorLightTime = null;
try {
moitorLightTime = SetMoitorTimeUtils.getMoitorLightTime();
} catch (IOException e) {
e.printStackTrace();
}
String defaultToolTip = "显示器时间MoitorTime";
if (!"".equals(moitorLightTime) && null != moitorLightTime) {
defaultToolTip = defaultToolTip + "\r\n" + "当前显示屏亮屏时间为:" + moitorLightTime;
}
trayIcon.setToolTip(defaultToolTip);
}
设置关闭显示器时间为1分钟
oneMintune.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
SetMoitorTimeUtils.setMonitorTimeOneMinute();
} catch (IOException ex) {
ex.printStackTrace();
}
SetMoitorTimeUtils.initTrayIconToolTip(trayIcon);
}
});
代码是在工程里摘抄出来的,具体详细的代码请看下面的仓库
gitee:https://gitee.com/wallwamusic/customset-moitortime
gitee: https://gitee.com/wallwamusic/customset-moitortime
总结
代码仓库贴出来,软件已经算开发完了,但是编写开发这个软件的过程中,还是碰到了一些问题,接下来如果还有精力的话,写一写开发过程中碰到了几个问题。应该会分别写一下JDK11如何根据自己的工程项目制作JRE的问题,如何使用exe4j把jar打包为exe启动包的方法,使用java如何创建windows快捷方式的问题,如何使用inno setup制作windows软件安装包的问题。软件虽小,五脏俱全,细细写来还是繁多,尽力写吧。