Java 如何确定GraphicsEnvironment是否存在

Java 如何确定GraphicsEnvironment是否存在,java,swing,awt,console-application,Java,Swing,Awt,Console Application,我有一个需要用户输入密码的应用程序 我想做的是从控制台读取密码(如果操作系统支持,例如unix),或者显示JOptionPane并要求用户输入密码(如果操作系统支持图形界面,例如windows) 有些人可能会争辩说,在上述两种情况下,控制台总是可用的,因此控制台输入就足够了。但问题是,如果Java应用程序开始使用javaw.exe,则控制台不可用。因此,我需要一种方法来确定我是否可以做任何一种情况 我的问题是如何确定应用程序运行的环境是否支持控制台或图形界面 我知道存在一种静态方法 Graphi

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

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

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

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

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

有人知道更多吗?我是否能够检索操作系统是否支持控制台或图形环境


提前感谢。

GraphicsEnvironment.ishadless()
将在以下情况下返回
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;
        }
    }

}

见@devnull谢谢你的回答。因此,实际上,正如另一篇文章所建议的,isHeadless()方法将完成这项工作。我一定是误读了Java文档。不过,我会尝试找到一台unix机器来运行这个应用程序,我会把我的发现发回到这里。谢谢你的回答。我唯一关心的是,当我调用isHeadless()方法并在控制台unix环境中运行时,它将返回true还是false?因为从JavaDoc中我可以看到:“测试在这个环境中是否支持显示、键盘和鼠标”,因此我认为即使在unix中(keybord将可用),它也会返回true。但我认为你的代码会解决我的问题。再次感谢。@nikkatsa上面我的回答已经解释过了。这些信息直接取自对源代码的分析。