java - 劫持 Java Swing 组件中的 `repaint()` 调用

标签 java swing user-interface

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

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

最佳答案

nidu 先说了,但他没回答我才说的。

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

关于java - 劫持 Java Swing 组件中的 `repaint()` 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13920447/

相关文章:

java - 使用@PropertySource配置Spring属性

java - 如何将对象绑定(bind)到 Swing 表中的一行?

ios - 在iOS的顶部导航栏中添加多个按钮

java - 有没有人使用 SIKULI 来测试他们基于 GUI 的应用程序?

java - 如何在 Activity 中保存光标?

找不到 java.sql.sqlexception 列

java - 使用 Tomcat 允许子域 session cookie 的最佳方式

java - 使用数据库数据自动/手动设置列宽 JTable

Java swing 定时器循环变慢

c++ - 将符合 Qt 的 C++ 转换为 ui XML(QtDesigner) 格式 :