【发布时间】:2016-12-19 19:12:55
【问题描述】:
我有这个代码:
package game;
import java.awt.Graphics;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Draw {
Object block;
public Draw(JFrame frame, Object object) {
this.block = object;
JPanel pane = new JPanel() {
private static final long serialVersionUID = 3869097656854760151L;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
try {
g.drawImage(ImageIO.read(new File(object.getTexture())), object.getX(), object.getY(), object.getWidth(),
object.getHeight(), null);
} catch (IOException e) {
System.err.println("Image '" + object.getTexture() + "' could not be found!");
}
}
};
frame.add(pane);
}
}
我在这里给班级打电话:
package game;
import javax.swing.JFrame;
public class Frame {
private final int X_SIZE = new vena.util.Computer().screenWidth();
private final int Y_SIZE = new vena.util.Computer().screenHeight();
public Frame() {
JFrame f = new vena.util.Frame().frame("2D Game", X_SIZE - X_SIZE / 5, Y_SIZE - Y_SIZE / 5, true, false, false,
"res/icon.png");
new Draw(f, new Object(0, 0, 100, 100, "grass"));
new Draw(f, new Object(100, 0, 100, 100, "grass"));
f.setVisible(true);
}
public static void main(String[] args) {
new Frame();
}
}
当我调用图像时它会呈现
new Draw(f, new Object(0, 0, 100, 100, "grass"));
但是当我再次调用图像时,在它旁边
new Draw(f, new Object(100, 0, 100, 100, "grass"));
它只渲染第二个图像,并删除第一个。我注意到当我在 paintComponent 方法中调用 g.drawImage() 两次时,不会发生这种情况。有没有办法让我可以在不清除 JPanel 的情况下多次调用 Draw 类?
【问题讨论】:
-
您似乎从未为您的框架设置layout。这意味着第二个面板在添加时将简单地替换第一个面板。使用适当的布局来根据需要放置两个面板。
-
另外,你不应该在你的paint方法中调用
ImageIO.read。这将有可怕的表现。在创建对象时读取图像,然后在每次调用paintComponent时重复使用相同的实例。
标签: java swing jframe jpanel paintcomponent