Obrazek pojawia się z opóźnieniem

0

W ramach testów skalowania napisałem taki programik:

import javax.swing.*;
import java.awt.*;

public class Skalowanie extends JFrame
{
    protected Image img;
    protected Image img2;
    //------------------------
    public static void main(String[] args)
    {
        new Skalowanie();
    }
    //------------------------
    public Skalowanie()
    {
        super("Skalowanie");
        img=Toolkit.getDefaultToolkit().createImage("pliki graficzne/Ayers.jpg");
        //img2=img.getScaledInstance(400,250,Image.SCALE_FAST);
        add(new PanelSkali(this),BorderLayout.CENTER);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);

        setVisible(true);
        repaint();
    }
    //------------------------
    public void run()
    {

    }
}
//------------------------------------------------
class PanelSkali extends JPanel
{
    private Skalowanie parent;
    //------------------------
    public PanelSkali(Skalowanie parent)
    {
        this.parent=parent;
        setPreferredSize(new Dimension(750,406));
    }
    //------------------------
    public void paintComponent(Graphics g)
    {
        System.out.println(parent.img);
        super.paintComponent(g);
        g.drawImage(parent.img,0,0,null);
        //g.drawImage(parent.img2,0,0,null);
    }
}

Obrazek na ekranie pojawia się dopiero po zmianie rozmiarów (w góre lub w dół) głównego okna. Dlaczego?
Programik miał różne wersje (repaint() w innym miejscu, SwingUtilities.invokeLater()) w funkcji main(),..) .
W każdej wersji zachowywał sie tak samo.
//Rozwiązane, obrazek nie był gotowy:

boolean done=false;
while(!done)
    done=g.drawImage(parent.img,0,0,null);
0

Dwa wyjścia:

  1. Ładujesz obraz synchronicznie za pomocą ImageIO
img = ImageIO.read(new File("OBRAZ.jpg"));

lub

  1. Dodajesz prepareImage do PanelSkali. W tym przypadku panel zostanie automatyczne przerysowany, gdy obraz się załaduje.
 public PanelSkali(Skalowanie parent)
{
      this.parent=parent;
      setPreferredSize(new Dimension(750,406));
      Toolkit.getDefaultToolkit().prepareImage(parent.img, -1, -1, this);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1