【问题标题】:Hijack `repaint()` call in Java Swing component在 Java Swing 组件中劫持“repaint()”调用
【发布时间】:2012-12-04 22:04:48
【问题描述】:

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

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

【问题讨论】:

  • 抱歉,com.mypapyri.clay.ui.App 扩展了哪个类?
  • 扩展JPanel(见第一段)。
  • 我只是在java docs 中找不到JPanel 的方法getDisplay()。我做错了什么?)
  • 也许这是 OP 写的方法? @nidu

标签: java swing user-interface


【解决方案1】:

nidu先说了,他不回答我就放了。

可能您在构造方法中调用了 super(),而 JPanel 构造函数试图在设置显示之前重新绘制。

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多