如何确定GraphicsEnvironment是否存在

nik*_*tsa 11 java swing awt console-application

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

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

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

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

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

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

提前致谢.

Gui*_*let 19

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;
    }
Run Code Online (Sandbox Code Playgroud)

如果您想知道是否有可用的屏幕,您可以调用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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

  • @nikkatsa在我上面的回答中都解释了这一点.此信息直接来自源代码的分析. (2认同)