Изображение не появляется, если я не изменю размер JFrame

Я пытался показать изображение в JFrame с помощью JPanel, но изображение появляется только в том случае, если я изменяю размер 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);
    }
} 

Я знаю, что происходит, поэтому любая помощь, которую я получу, будет оценена


person basketballhead24    schedule 07.10.2012    source источник


Ответы (2)


Toolkit.createImage() загружать изображения асинхронно. Попробуйте указать наблюдатель изображений. JPanel реализует ImageObserver, поэтому можно использовать следующую строку:

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

В качестве альтернативы вы можете использовать ImageIO.read для синхронной загрузки изображений.

person tenorsax    schedule 07.10.2012

Согласно учебнику по JFrame, они рекомендуют выполнять только пакет или setSize прежде чем установить видимый. Как насчет изменения порядка добавления и установки размера?

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

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

}
person Guido Simone    schedule 07.10.2012