首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以编程方式设置java.awt.headless=true

以编程方式设置java.awt.headless=true
EN

Stack Overflow用户
提问于 2010-03-31 19:17:04
回答 5查看 63.4K关注 0票数 35

我试图在应用程序启动时设置java.awt.headless=true,但似乎太晚了,并且非headless模式已经启动:

代码语言:javascript
运行
复制
static {
    System.setProperty("java.awt.headless", "true");
    /* java.awt.GraphicsEnvironment.isHeadless() returns false */
}

除了-Djava.awt.headless=true之外,还有其他方法将headless设置为true吗?我不希望在控制台上配置任何东西。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-31 19:32:13

我在一个类中使用main(),它在常量(和其他静态代码)中静态加载JFreeChart的不同部分。

将静态加载块移动到类的顶部解决了我的问题。

这不起作用:

代码语言:javascript
运行
复制
  public class Foo() {
    private static final Color COLOR_BACKGROUND = Color.WHITE;

    static { /* too late ! */
      System.setProperty("java.awt.headless", "true");
      System.out.println(java.awt.GraphicsEnvironment.isHeadless());
      /* ---> prints false */
    }

    public static void main() {}
  }

通过将静态块移动到类的顶部,让尽可能早地执行静态块!

代码语言:javascript
运行
复制
  public class Foo() {
    static { /* works fine! ! */
      System.setProperty("java.awt.headless", "true");
      System.out.println(java.awt.GraphicsEnvironment.isHeadless());
      /* ---> prints true */
    }

    private static final Color COLOR_BACKGROUND = Color.WHITE;

    public static void main() {}
  }

当考虑到它时,这是完全有意义的:)。朱胡!

票数 41
EN

Stack Overflow用户

发布于 2010-03-31 19:22:20

这应该是可行的,因为对System.setProperty的调用是在创建工具包之前:

代码语言:javascript
运行
复制
public static void main(String[] args)
{
    // Set system property.
    // Call this BEFORE the toolkit has been initialized, that is,
    // before Toolkit.getDefaultToolkit() has been called.
    System.setProperty("java.awt.headless", "true");

    // This triggers creation of the toolkit.
    // Because java.awt.headless property is set to true, this 
    // will be an instance of headless toolkit.
    Toolkit tk = Toolkit.getDefaultToolkit();

    // Check whether the application is
    // running in headless mode.
    GraphicsEnvironment ge = 
        GraphicsEnvironment.getLocalGraphicsEnvironment();
    System.out.println("Headless mode: " + ge.isHeadless());
}
票数 4
EN

Stack Overflow用户

发布于 2011-08-16 08:43:13

这是一种完全不同的方法。

代码语言:javascript
运行
复制
try {
    Field defaultHeadlessField = java.awt.GraphicsEnvironment.class.getDeclaredField("defaultHeadless");
    defaultHeadlessField.setAccessible(true);
    defaultHeadlessField.set(null,Boolean.FALSE);
    Field headlessField = java.awt.GraphicsEnvironment.class.getDeclaredField("headless");
    headlessField.setAccessible(true);
    headlessField.set(null,Boolean.TRUE);
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (NoSuchFieldException e) {
    e.printStackTrace();
}

我在一个无头环境(Ubuntu)中成功地利用了服务器端的BufferedImages。这样做的好处是,它不需要在命令行上设置任何-D变量,也不需要设置DISPLAY变量。

您还可以在任何时候执行此代码。您不需要担心在加载其他类之前调用此函数。

我认为,如果您试图从无头环境中驱动远程机器上的Swing接口,那么这可能不起作用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2552371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档