除非我调整JFrame的大小,否则图像不会出现

时间:2012-10-07 02:21:52

标签: java image swing paintcomponent drawimage

我一直在尝试使用JPanel在JFrame上显示图像,但只有在我调整JFrame大小时才显示图像

显示:

package display;

import javax.swing.JFrame;
import img.*;

public class Screen extends JFrame{

    private static final long serialVersionUID = 1L;

    Spaceship s = new Spaceship();
    public static void main(String[]args){
    new Screen();
    }

    public Screen(){
    setTitle("Spaceships!");
    setSize(700,605);
    setLocationRelativeTo(null);
    add(s);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);

    }
}

飞船

package img;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JPanel;

public class Spaceship extends JPanel{

    private static final long serialVersionUID = 1L;

    Image spaceship = (Image)Toolkit.getDefaultToolkit().getImage(getClass().getResource("res/spaceship.png"));

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(spaceship,100,100,null);
    }
} 

我知道有什么线索,所以我得到的任何帮助都会受到赞赏

2 个答案:

答案 0 :(得分:3)

Toolkit.createImage()异步加载图片。尝试指定图像观察者。 JPanel实现ImageObserver,因此可以使用以下行:

g.drawImage(spaceship, 100, 100, this);

作为替代方案,您可以使用ImageIO.read同步加载图片。

答案 1 :(得分:1)

根据JFrame Tutorial,他们建议您在设置可见之前执行pack或setSize。如何更改add和setSize的顺序?

public Screen(){
    setTitle("Spaceships!");
    setLocationRelativeTo(null);
    add(s);
    setSize(700,605);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);

}