我目前正在为我们当地的消防部门编写一个程序,以显示必须占用的救火车、警报的目的地等。
该程序本身是用 Java 编写的,并在连接到电视屏幕的树莓派上运行。为了防止屏幕停留在同一站点和内容上并防止屏幕烧屏,我想在警报结束时使屏幕进入睡眠状态或打开屏幕保护程序(命令将通过 TCP 发送,但这不是问题)。我还想在收到新警报时重新打开屏幕。
我还没有找到一种解决方案,可以让屏幕进入睡眠状态或屏幕保护程序,然后重新启动。有没有人做过这样的事情?
我目前正在为我们当地的消防部门编写一个程序,以显示必须占用的救火车、警报的目的地等。
该程序本身是用 Java 编写的,并在连接到电视屏幕的树莓派上运行。为了防止屏幕停留在同一站点和内容上并防止屏幕烧屏,我想在警报结束时使屏幕进入睡眠状态或打开屏幕保护程序(命令将通过 TCP 发送,但这不是问题)。我还想在收到新警报时重新打开屏幕。
我还没有找到一种解决方案,可以让屏幕进入睡眠状态或屏幕保护程序,然后重新启动。有没有人做过这样的事情?
不幸的是,Java 没有为此提供内置库。但是,你可以做
Runtime.getRuntime().exec("xscreensaver-command -activate");
要停用屏幕保护程序,请执行
Runtime.getRuntime().exec("xscreensaver-command -deactivate");
另外,请确保已安装 xscreensaver
sudo apt-get install xscreensaver
我不知道这是否有助于减少屏幕的热量,但你可以试试
public class ScreenSaver {
private static final JFrame frame = new JFrame();
public static void startScreenSaver() throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
frame.setBackground(Color.BLACK);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setUndecorated(true);
frame.validate();
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(frame);
frame.setVisible(true);
}
public static void stopScreenSaver() {
frame.setVisible(false);
}
}
没有办法从普通的 java 中做到这一点。您将需要求助于特定于平台的 API(使用 JNI),或者如果可以使用特定于平台的命令行实用程序。
自己模拟屏幕保护程序虽然可能,但只会浪费更多电量(您正在积极绘制一些浪费 CPU/GPU 电量的东西,并且屏幕不会进入待机状态)。
最好放弃从您的应用程序控制屏幕的想法。而是将其留给操作系统 - 任何平台都应该很容易设置为在一段时间后关闭屏幕而无需用户输入。
我不认为 java 允许您控制计算机上的本机功能,例如睡眠或待机。
您可以采取以下几种选择:
1)如果您的程序将始终处于焦点,您可以有一个线程来跟踪程序没有被触摸的时间,然后您可以在程序中激活“屏幕保护程序”。
2)您可以使用JNA访问计算机的本机功能,并将其设置为显示屏幕保护程序或在那里进入睡眠状态。