在Java Swing组件中劫持`repaint()`调用
我正在编写一个在无头环境中运行的应用程序,它需要输出到在Java Swing组件中劫持`repaint()`调用,java,swing,user-interface,Java,Swing,User Interface,我正在编写一个在无头环境中运行的应用程序,它需要输出到缓冲图像,而不是屏幕。我有一个Display类来管理buffereImage。我的应用程序扩展了JPanel,为了在组件更新时自动重新绘制,我将repaint()重新实现为: public void repaint(){ Graphics2D g = getDisplay().getGraphics(); paint(g); getDisplay().repaint(); } 然而,每当我启动我的应用程序时,当它试图
缓冲图像
,而不是屏幕。我有一个Display
类来管理buffereImage
。我的应用程序扩展了JPanel
,为了在组件更新时自动重新绘制,我将repaint()
重新实现为:
public void repaint(){
Graphics2D g = getDisplay().getGraphics();
paint(g);
getDisplay().repaint();
}
然而,每当我启动我的应用程序时,当它试图绘制到显示时,我会得到一个NullPointerException
。这可能是JPanel
构造函数中试图重新绘制的某些代码。问题是getDisplay()
返回null。但是,显示
已经实例化,并在此时传递给应用程序。我已经验证了这一点,在将其发送到应用程序之前,让显示器在创建时打印出自己的属性
例外情况如下:;最上面的位置是指包含getDisplay()
的行:
线程“main”java.lang.NullPointerException中的异常
位于com.mypapyri.clay.ui.App.repaint(App.java:28)
位于javax.swing.JComponent.setFont(JComponent.java:2746)
位于javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:208)
位于javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:66)
位于javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:56)
位于javax.swing.JComponent.setUI(JComponent.java:655)
位于javax.swing.JPanel.setUI(JPanel.java:153)
位于javax.swing.JPanel.updateUI(JPanel.java:126)
位于javax.swing.JPanel。(JPanel.java:86)
位于javax.swing.JPanel。(JPanel.java:109)
位于javax.swing.JPanel。(JPanel.java:117)
在com.mypapyri.clay.ui.App.(App.java:18)
在ClayOS。(ClayOS.java:22)
在ClayOS.main(ClayOS.java:84)
编辑:我对此进行了研究,但没有找到令人满意的解决方案
- Javadocs
- 油漆管理器和重新油漆管理器
nidu先说了,但既然他不回答,我就说了出来
可能您正在构造函数方法中调用super(),而JPanel构造函数正在设置显示之前尝试重新绘制。对不起,但是哪个类会com.mypapyri.clay.ui.App
extends?extendsJPanel
(请参见第一段)。我就是找不到方法getDisplay()
用于中的JPanel
。我做错了什么?)也许这是OP写的方法@奈杜塞也是。
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)