这里奇怪的一点。我有两个类从JPanel
延伸,在两者中都覆盖paintComponent
。一个实现Runnable
(用于动画目的)。
但是,当与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;
}
}
编辑:详细修改,因为在我添加标签时,回车键不应提交问题。
完成编辑 @ 13:38。
答案 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);
}
}
正如我对你的问题的评论(在看到代码之前)中所指出的,如果不调用超级,你就会打破绘画链,可能会导致子组件渲染产生副作用。