自定义 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,您将破坏绘制链,可能会导致子组件渲染的副作用。
这里有点奇怪。我有两个 类 从 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,您将破坏绘制链,可能会导致子组件渲染的副作用。