我正在编写一个在无头环境中运行的应用程序,需要输出到 aBufferedImage
而不是屏幕。我有一个Display
班级管理BufferedImage
. 我的应用程序扩展JPanel
并且为了使其在组件更新时自动重绘,我重新实现repaint()
为:
public void repaint(){
Graphics2D g = getDisplay().getGraphics();
paint(g);
getDisplay().repaint();
}
但是,每当我启动我的应用程序时,NullPointerException
当它尝试绘制到Display
. 这应该是JPanel
构造函数中试图重绘的一些代码。问题是getDisplay()
返回null。但是,此时Display
已经实例化并传递给应用程序。Display
在将其发送到应用程序之前,我已经通过在创建时打印出它自己的属性来验证这一点。
例外情况如下;最上面的位置是指包含以下内容的行getDisplay()
:
Exception in thread "main" java.lang.NullPointerException
at com.mypapyri.clay.ui.App.repaint(App.java:28)
at javax.swing.JComponent.setFont(JComponent.java:2746)
at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:208)
at javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:66)
at javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:56)
at javax.swing.JComponent.setUI(JComponent.java:655)
at javax.swing.JPanel.setUI(JPanel.java:153)
at javax.swing.JPanel.updateUI(JPanel.java:126)
at javax.swing.JPanel.<init>(JPanel.java:86)
at javax.swing.JPanel.<init>(JPanel.java:109)
at javax.swing.JPanel.<init>(JPanel.java:117)
at com.mypapyri.clay.ui.App.<init>(App.java:18)
at ClayOS.<init>(ClayOS.java:22)
at ClayOS.main(ClayOS.java:84)
编辑:我对此进行了研究,但找不到令人满意的解决方案。
- repaint() 方法和 GUI 线程
- 组件的 Javadocs
- 油漆管理器和重绘管理器