我有一个需要用户输入密码的应用程序。
我想要做的是从控制台读取密码(如果操作系统支持一个例如unix)或显示JOptionPane并要求用户输入他的密码(如果操作系统支持图形界面,例如窗口)。
有些人可能会争辩说,在上述两种情况下都会提供控制台,因此控制台输入就足够了。但问题是如果Java应用程序开始使用javaw.exe,则控制台不可用。因此,我需要一种方法来确定我是否可以做任何一种情况。
我的问题是如何确定运行应用程序的环境是否支持控制台或图形界面。
我知道存在静态方法
GraphicsEnvironment.isHeadless()
但是从Java doc我认为这种方法无法区分操作系统是否支持图形,而是操作系统可以支持其中一种I / O设备(键盘,鼠标,屏幕)。
有没有人对此有更多了解?如果操作系统支持控制台或图形环境,我能够检索吗?
提前致谢。
答案 0 :(得分:19)
GraphicsEnvironment.isHeadless()
将返回true
,以防:
java.awt.headless
已设置为true
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;
}
}
}