我正在尝试将背景图像绘制到我正在制作的生活模拟游戏的JFrame上。这是我的代码:
public class MainFrame extends JFrame {
//creates image variables
Image background;
public MainFrame(int w, int h) {
//creates new JFrame and sets some other properties
super("Life Simulation");
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(w,h));
//creates images
background = Toolkit.getDefaultToolkit().createImage("img/default.jpg");
this.repaint();
setVisible(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g.drawImage(background,0,0,null);
}
}
我试着在设置它可见之前重新绘制它,但是没有。当我从main方法启动程序时,JFrame是空白的。但是,如果我稍微调整一下它的大小,就会调用paint方法并绘制背景图像。
这是我的主要方法:
public class Main {
public static void main(String[] args) {
MainFrame frame = new MainFrame(1080,720);
frame.repaint(); //tried invoking paint() here as well but again to no avail
}
}
编辑:我认为值得一提的是,我之前几乎没有使用paint()或它的任何变体的经验,只知道它应该如何实现和它的能力。
哦,我想强调在调用drawImage
方法时提供适当的ImageObserver对象的重要性。而不是通过null
,我建议通过this
:
g.drawImage(background, 0, 0, this);
你可以读到通过Toolkit.createImage
异步加载图像时指定ImageObserver的重要性。
旁白:虽然paintComponent
没有为JFrame定义,但我建议避免重写JFrame的paint
方法。相反,您可以创建一个可重用的ImagePanel类,或者只是使用一个匿名类,然后使用它来设置JFrame的内容窗格。
下面是一个ImagePanel类的例子:
class ImagePanel extends JPanel {
private Image image;
public ImagePanel(Image image) {
this.image = image;
}
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
}
或者如果您喜欢匿名类:
setContentPane(new JPanel() {
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
});