我正在编写一个在 headless 环境中运行的应用程序,需要输出到 BufferedImage
而不是屏幕。我有一个管理 BufferedImage
的 Display
类。我的应用程序扩展了 JPanel
并且为了让它在组件更新时自动重新绘制,我重新实现了 repaint()
如下:
public void repaint(){
Graphics2D g = getDisplay().getGraphics();
paint(g);
getDisplay().repaint();
}
但是,每当我启动我的应用程序时,当它尝试绘制到 Display
时,我都会收到一个 NullPointerException
。这应该是 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)
编辑:我对此进行了研究,但找不到令人满意的解决方案。
- The repaint() method and the GUI thread
- Component 的 Javadocs|
- PaintManager 和 RepaintManager
最佳答案
nidu 先说了,但他没回答我才说的。
可能您正在构造函数方法中调用 super(),并且 JPanel 构造函数试图在设置显示之前重新绘制。
关于java - 劫持 Java Swing 组件中的 `repaint()` 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13920447/