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.read別の方法として、どの画像を同期的にロードするかを使用できます。

于 2012-10-07T02:42:02.270 に答える
1

JFrameチュートリアルによると、visibleを設定する直前に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 に答える