如何在创建时绘制JFrame?

时间:2014-07-14 15:59:01

标签: java jframe paint

我正在尝试将背景图像绘制到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()或其任何变体,只知道它应该如何实现及其能力。

1 个答案:

答案 0 :(得分:2)

哦,我想强调在调用drawImage方法时提供适当的ImageObserver对象的重要性。我建议不要传递null,而是传递this

g.drawImage(background, 0, 0, this);

通过Toolkit.createImage异步加载图片时,您可以阅读importance of specifying an ImageObserver

旁白:虽然没有为JFrame定义paintComponent,但我建议您避免覆盖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);
    }
});