【问题标题】:How to determine if GraphicsEnvironment exists如何判断 GraphicsEnvironment 是否存在
【发布时间】:2013-05-12 17:01:25
【问题描述】:

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

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

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

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

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

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

提前致谢。

【问题讨论】:

标签: java swing awt console-application


【解决方案1】:

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

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

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

    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;
        }
    }

}

【讨论】:

  • 感谢您的回答。我唯一担心的是,当我调用 isHeadless() 方法并且我在控制台 unix 环境中运行时,它会返回 true 还是 false?因为从 JavaDoc 中我可以看到:“测试此环境中是否支持显示器、键盘和鼠标”,因此我认为即使在 unix 中(键盘可用)它也会返回 true。但我认为你的代码会解决我的问题。再次感谢。
  • @nikkatsa 这一切都在我上面的回答中得到了解释。此信息直接来自对源代码的分析。
猜你喜欢
  • 2021-07-26
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 2010-12-30
  • 2011-07-14
  • 2023-03-19
相关资源
最近更新 更多