如何确定GraphicsEnvironment是否存在

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

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

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

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

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

有谁知道更多关于这个? 如果操作系统支持控制台或图形环境,我能够检索吗?

提前致谢。

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