自定义JPanel导致第二个自定义JPanel中的渲染问题

时间:2015-06-14 12:32:19

标签: java swing jpanel paintcomponent

这里奇怪的一点。我有两个类从JPanel延伸,在两者中都覆盖paintComponent。一个实现Runnable(用于动画目的)。

但是,当与Runnable一起使用时,我会在Runnable实例的背景中获得精彩的“绘制鼠标指向的所有内容的副本”。请参见下面的屏幕截图:

using_a_jpanel

using a custom component

两者之间的唯一区别是我在前者中使用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。

1 个答案:

答案 0 :(得分:2)

啊,你的paintComponent方法 错过了超级电话。变化

@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);
    }
}

正如我对你的问题的评论(在看到代码之前)中所指出的,如果不调用超级,你就会打破绘画链,可能会导致子组件渲染产生副作用。