自定义 JPanel 在第二个自定义 JPanel 中导致呈现问题

Custom JPanel causing rendering problems in second custom JPanel

这里有点奇怪。我有两个 类 从 JPanel 扩展而来,覆盖了两者中的 paintComponent。一个实现 Runnable(用于动画目的)。

然而,当与上面的Runnable一起使用时,我在Runnable实例的背景中得到了美妙的"paint a copy of everything the mouse points at"。请参阅下面的屏幕截图:

两者之间的唯一区别是我在前者中使用 JPanel,而在后者中使用带有背景图像的自定义 JPanel。下面第二个 JPanel 的代码:

package view.widgets;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class PaintedJPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private BufferedImage backgroundImage = null;

    public PaintedJPanel() {
        super();
    }

    public PaintedJPanel(File image) {
        super();
        try {
            backgroundImage = ImageIO.read(image);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        if(null != backgroundImage) {
            g2d.drawImage(backgroundImage, 0, 0, null);
        }
    }

    public BufferedImage getBackgroundImage() {
        return backgroundImage;
    }

    public void setBackgroundImage(BufferedImage backgroundImage) {
        this.backgroundImage = backgroundImage;
    }

}

编辑:详细编辑,因为在我添加标签时回车键不应该提交问题。

完成编辑 @ 13:38.

啊,您的 paintComponent 方法 缺少 super 的调用。变化

@Override
protected void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    if(null != backgroundImage) {
        g2d.drawImage(backgroundImage, 0, 0, null);
    }
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    if(null != backgroundImage) {
        g2d.drawImage(backgroundImage, 0, 0, null);
    }
}

正如我在对您的问题的评论中指出的(在查看代码之前),如果不调用 super,您将破坏绘制链,可能会导致子组件渲染的副作用。