在Java Swing组件中劫持`repaint()`调用

时间:2012-12-17 19:05:27

标签: java swing user-interface

我正在编写一个在无头环境中运行的应用程序,需要输出到BufferedImage而不是屏幕。我有一个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)

编辑:我对此进行了研究,但未能找到满意的解决方案。

1 个答案:

答案 0 :(得分:1)

nidu首先告诉它,但是因为他没有回答我说的。

可能你在构造函数方法中调用了super(),并且JPanel构造函数在设置显示之前尝试重绘。