2

我一直在尝试使用 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);
    }
} 

我知道发生了什么,所以我得到的任何帮助将不胜感激

4

2 回答 2

3

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

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

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

于 2012-10-07T02:42:02.270 回答
1

根据JFrame 教程,他们建议在设置可见之前执行 pack 或 setSize。改变 add 和 setSize 的顺序怎么样?

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

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

}
于 2012-10-07T02:42:30.853 回答