Java 自定义JPanel导致第二个自定义JPanel中出现渲染问题

Java 自定义JPanel导致第二个自定义JPanel中出现渲染问题,java,swing,jpanel,paintcomponent,Java,Swing,Jpanel,Paintcomponent,这里有点奇怪。我有两个从JPanel扩展而来的类,它们都覆盖了paintComponent。一个实现可运行(用于动画目的) 然而,当与上面的Runnable一个一起使用时,我在Runnable实例的背景中得到了美妙的“绘制鼠标指向的所有内容的副本”。请参见下面的屏幕截图: 两者之间的唯一区别是前者使用JPanel,后者使用带有背景图像的自定义JPanel。下面第二个JPanel的代码: package view.widgets; import java.awt.Graphics; impo

这里有点奇怪。我有两个从
JPanel
扩展而来的类,它们都覆盖了
paintComponent
。一个实现
可运行
(用于动画目的)

然而,当与上面的
Runnable
一个一起使用时,我在
Runnable
实例的背景中得到了美妙的“绘制鼠标指向的所有内容的副本”。请参见下面的屏幕截图:

两者之间的唯一区别是前者使用
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;
    }

}
编辑:详细编辑,因为在添加标签时,Enter键不应提交问题


编辑完毕@13:38。

啊,你的paintComponent方法错过了super的调用。改变

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


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

如果没有代码,即使不是不可能,也很难提供帮助,但我同意,不要发布“整个类代码”因为这可能包含许多与您的问题完全无关的代码。相反,我建议您创建并发布一个或。几个快速问题——您的
paintComponent(Graphics g)
override方法是否在其中调用
super.paintComponent(g)
?如果没有,他们正在破坏绘制链,可能会导致子组件渲染的副作用。是否更改绘图组件中的图形仿射变换、笔划或其他关键属性?如果是这样,只在图形对象的副本上进行这些更改,而不是在JVM给定的副本上进行这些更改。您是否在paintComponent方法中持有任何程序逻辑,或者从该方法中更改组件的非图形元素的状态?我正要对您最初的评论进行评论,不敢相信我错过了。另一个班在那里!当站点允许我时,将标记为答案!:)@Gorb:很高兴这有帮助。@Gorb:请注意,我并没有自动回答您的问题,事实上,您确实得到了不错的帮助,因为您在这里发布了一个简单的示例程序。与你的问题相比,我们需要完全理解你的问题和你的问题有什么不同?因为我要求不同的东西,情况也不同。我在去医院的火车上,这比我应该给出的理由要多。如果你没有时间,你也不知道,那很好。听听我在问什么。我要求的是知识,而不是要粘贴的代码片段。
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    if(null != backgroundImage) {
        g2d.drawImage(backgroundImage, 0, 0, null);
    }
}