java - 如何判断 GraphicsEnvironment 是否存在

标签 java swing awt console-application

我有一个应用程序需要用户输入密码。

我想做的是从控制台读取密码(如果操作系统支持一个,例如 unix)或显示一个 JOptionPane 并要求用户输入他的密码(如果操作系统支持图形界面,例如 windows)。

有些人可能会争辩说,在上述两种情况下,控制台总是可用的,因此控制台输入就足够了。但问题是,如果 Java 应用程序开始使用 javaw.exe,则控制台不可用。因此,我需要一种方法来确定我是否可以做任何一种情况。

我的问题是如何确定应用程序运行的环境是支持控制台还是图形界面。

我知道静态方法存在 GraphicsEnvironment.isHeadless() 但是从 Java 文档来看,我认为这种方法无法区分操作系统是否支持图形,而不是操作系统是否可以支持其中一种 I/O 设备(键盘、鼠标、屏幕)。

有人知道吗?如果操作系统支持控制台或图形环境,我可以检索吗?

提前致谢。

最佳答案

GraphicsEnvironment.isHeadless() 将在以下情况下返回 true:

  • 系统属性 java.awt.headless 已设置为 true
  • 您正在 Unix/Linux 系统上运行并且没有设置DISPLAY环境变量

这是用于检索 headless 属性的代码:

    String nm = System.getProperty("java.awt.headless");

    if (nm == null) {
        /* No need to ask for DISPLAY when run in a browser */
        if (System.getProperty("javaplugin.version") != null) {
            headless = defaultHeadless = Boolean.FALSE;
        } else {
            String osName = System.getProperty("os.name");
            headless = defaultHeadless =
                Boolean.valueOf(("Linux".equals(osName) || "SunOS".equals(osName)) &&
                                (System.getenv("DISPLAY") == null));
        }
    } else if (nm.equals("true")) {
        headless = Boolean.TRUE;
    } else {
        headless = Boolean.FALSE;
    }

如果您想知道是否有可用的屏幕,您可以调用 GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices(),它会返回所有可用的屏幕。

import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.HeadlessException;

public class TestHeadless {

    private static boolean isReallyHeadless() {
        if (GraphicsEnvironment.isHeadless()) {
            return true;
        }
        try {
            GraphicsDevice[] screenDevices = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
            return screenDevices == null || screenDevices.length == 0;
        } catch (HeadlessException e) {
            e.printStackTrace();
            return true;
        }
    }

}

关于java - 如何判断 GraphicsEnvironment 是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16610525/

相关文章:

java - JTree,始终显示 "edit mode"中的所有节点

java - Java Applet 中的面板不显示

java - 如何用相关子类的多个实例填充 Java HashMap?

java - 编程技巧: not able to modify variable before constructor call

java - 线程异常...: null - trying to convert String from file to Integer

java - IntelliJ 将 Lombok 生成的方法突出显示为 “cannot resolve method”

JAVA:如何使用方法的名称参数创建按钮?

java - 如何将组件限制在某个位置

Java 交叉口错误

Java MouseListener - 进入和退出 JPanel 的事件