Java - 让屏幕进入睡眠状态(或屏保)

Java - Put screen to sleep (or screensaver)

我目前正在为我们当地的消防部门编写一个程序,以显示必须占用的消防车、警报的目的地等。

程序本身是用 Java 编写的,并在连接到电视屏幕的 raspberry pi 上运行。为了保护屏幕不停留在相同的站点和内容并防止屏幕烧屏我想在警报结束时让屏幕进入睡眠状态或打开屏幕保护程序(命令将通过 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 不允许您控制计算机上的本机功能,例如睡眠或待机。

您可以选择以下几个选项:

1) 如果您的程序将始终处于焦点,您可以有一个线程来跟踪您的程序有多久没有被触及,然后您可以在您的程序中激活一个 "screensaver"。

2) 你可以使用JNA来访问计算机的本地功能,并将其设置为显示屏幕保护程序或在那里休眠。

无法从普通 java 执行此操作。您将需要求助于特定于平台的 API(使用 JNI),或者如果可以使用特定于平台的命令行实用程序。

自己模拟屏幕保护程序虽然可能,但只会浪费更多电量(您正在主动绘制一些东西,浪费 CPU/GPU 电量,并且屏幕不会进入待机状态)。

最好放弃 从您的应用程序控制屏幕的想法。而是将其留给操作系统 - 任何平台都应该很容易设置为在一段时间后无需用户输入即可关闭屏幕。