我有这段代码:
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()两次时不会发生这种情况。有没有办法让我可以根据需要多次调用Draw类,而无需清除JPanel?
答案 0 :(得分:2)
框架内容窗格的默认布局管理器是BorderLayout。将组件添加到BorderLayout并且您没有指定约束时,组件将转到CENTER。只有最后添加的组件才能显示在CENTER中。
如果您想在框架上放置多个组件,则可以更改布局管理器。尝试
f.setLayout( new FlowLayout() );
看到差异。
我注意到,当我在paintComponent方法中调用g.drawImage()两次时,这不会发生。
是的,如果您尝试在帧上的特定位置绘制图像,那么您应该覆盖paintComponent()来绘制每个图像。