Swing 如何在没有JFrame的情况下为JPanel进行布局?(还包括-java.awt.headless故障)

Swing 如何在没有JFrame的情况下为JPanel进行布局?(还包括-java.awt.headless故障),swing,layout,amazon-ec2,awt,Swing,Layout,Amazon Ec2,Awt,我需要从基于JavaServlet的应用程序中动态生成一些图像。我想让布局比仅仅使用硬编码位置和Graphics2D.drawString更易于维护,所以我想我会使用AWT/Swing布局 这在我的Windows开发机器上运行良好(创建JFrame,添加组件,.pack()frame,通过将BuffereImage传递给component.paint()进行渲染;注意,我没有调用.setVisible(true))。(注意-我使用JFrame的唯一原因是有一些东西可以调用.pack(),否则我可

我需要从基于JavaServlet的应用程序中动态生成一些图像。我想让布局比仅仅使用硬编码位置和Graphics2D.drawString更易于维护,所以我想我会使用AWT/Swing布局

这在我的Windows开发机器上运行良好(创建JFrame,添加组件,.pack()frame,通过将BuffereImage传递给component.paint()进行渲染;注意,我没有调用.setVisible(true))。(注意-我使用JFrame的唯一原因是有一些东西可以调用.pack(),否则我可能需要一些更轻量级的东西。)

但是,它在我的Elastic Beanstalk管理的AWS EC2 Tomcat7机器上失败,带有java.awt.HeadlessException

java.awt.HeadlessException
    at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:173)
    at java.awt.Window.<init>(Window.java:477)
    at java.awt.Frame.<init>(Frame.java:419)
    at javax.swing.JFrame.<init>(JFrame.java:218)
编辑/etc/tomcat7/tomcat7.conf并将以下内容放在那里:

JAVA_OPTS="-Djava.awt.headless=false"
尽管重新部署/Tomcat重启后,传递给Tomcat的JVM选项似乎是“java.awt.headless=true”:

此外,尽管我的代码仍然没有找到设置的属性:

log.error("java.awt.headless=", System.getProperty("java.awt.headless"));
这将产生:

2013-01-14 22:13:17,421 +0000 [http-bio-8080-exec-4] ERROR ServiceImpl:45  - java.awt.headless=
编辑-我也有

System.setProperty("java.awt.headless", "false");
但这似乎也没有帮助

Edit2-我去掉了JFrame,只是实例化了一个JPanel。现在,它可以在无头环境中渲染

但是,我不知道如何正确地进行布局。我一直在不同的布局上调用doLayout,在组件上调用something.setSize(something.getPreferredSize()),但结果是重叠的或不可见的标签。这都是因为我不再调用JFrame.pack()(因为没有JFrame可以调用它)

那么第三个问题-如何确保我的JPanel在没有调用.pack()的JFrame的情况下正确布局?

Edit3-第三个问题的答案是调用panel.addNotify();panel.setSize(panel.getPreferredSize());panel.validate();这要感谢安德鲁·汤姆森:


请更加小心引用-我很确定@Andrew从未建议使用
面板。notify
查看
addNotify(…)
的实现,它保留了系统资源。真正需要的是递归地调用
doLayout(…)
,比如in。
2013-01-14 22:13:17,421 +0000 [http-bio-8080-exec-4] ERROR ServiceImpl:45  - java.awt.headless=
System.setProperty("java.awt.headless", "false");