如何检测是否支持图形界面?

26

我希望我的Java程序具有两种显示模式:GUI界面和命令行界面。如果在Windows、OS X或其他图形化环境中运行程序,则应该获得GUI界面,但如果通过SSH运行程序,则应该获得命令行界面。

如何检测是否可以显示GUI界面,或者是否应该使用命令行界面?

5个回答

37

您实际上有两个问题:

1)检查您是否在无图形界面的(headless)环境下运行。请检查此方法:

if (GraphicsEnvironment.isHeadless()) {
     // non gui mode
} else {
     // gui mode
}

2) 检查你正在运行的操作系统:

System.getProperty("os.name")

然而,即使在无界面环境下操作,第二个问题仍将返回相同的名称。


@dacwe,问题中关于操作系统的部分似乎只是对已进行的研究的解释,而不是第二个问题。因此,我将其从原始问题中删除,因为这是无用信息。我认为您应该编辑您的答案以反映澄清后的问题。 - FThompson
1
这不是完全正确的答案,请参考这个问题在某些情况下,“isHeadless”会返回意外的真值,而这并不是你想要的,当你正在寻找屏幕或显示器是否可用时。 - Indigo
有没有一种方法可以从命令行检查此属性? - Sanket Patel

4
Both dacwe and vitaut are correct. One additional recommendation I would like to make is to use the MVC (Model-View-Controller) pattern when designing your application. If it is running in a UI mode, use UIView, otherwise use ConsoleView.
Dacwe recommended how to automatically determine which mode to use. As Java is a cross-platform language, the name of the operating system is irrelevant. What is more relevant is whether the system has a graphical environment. Therefore, use GraphicsEnvironment.isHeadless().
To create a shell controlled application, use System.console().

2

我建议添加一个命令行选项,确定是使用命令行还是图形用户界面,因为即使在GUI可用的环境中,用户可能也希望使用命令行接口。

您还可以使用System.console()检查控制台设备是否可用。


2
为什么不创建两个类,一个用于命令行,一个用于图形界面?在后面你可能想要创建两个产品,这样你就可以提供一个无需图形库依赖的无头版本。

-4

我正在寻找相同的解决方案,最终想到了使用参数,这样当我从命令行运行程序时,参数的长度就会有所不同。

if(args.length > 0) {
    System.out.println("command line mode");
}

3
顺便提一下,你也可以为窗口应用程序指定参数。另外,你也可以从控制台中不带参数地调用你的应用程序。 - Yanick Rochon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接