JWindow отображает пустым в течение секунды, прежде чем показывать изображение

Я написал JWindow, который служит заставкой для моего настольного приложения. У меня проблема в том, что после того, как окно становится видимым, оно на мгновение остается пустым, прежде чем отобразить намеченное изображение. Пустое окно остается иногда от 0,5 до 2 секунд. Я хотел бы, чтобы содержимое полностью отображалось до того, как окно станет видимым.

Я на MacOS с использованием Java 1.6.

Вот окно сразу после того, как я его запускаю:

И только через полсекунды это показывает изображение. Изображение довольно маленькое (около 95kBytes JPG). Я знаю, что проблема не в загрузке ImageIcon, потому что конструктор должен блокировать, пока изображение не будет загружено.

Вот мой код:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JWindow;

public class SplashScreen extends JWindow
{
    public SplashScreen()
    {
        ClassLoader classLoader = this.getClass().getClassLoader();
        ImageIcon imageIcon = new ImageIcon(classLoader.getResource("res/landscape.jpg"));
        while (imageIcon.getImageLoadStatus() != MediaTracker.COMPLETE) {}
        JLabel lbl = new JLabel(imageIcon);
        getContentPane().add(lbl, BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);

        MouseListener mouseListener = new MouseAdapter()
        {
            public void mousePressed(MouseEvent event)
            {
                setVisible(false);
                dispose();
            }
        };

        addMouseListener(mouseListener);
        setVisible(true);
    }

    public static void main(String argv[])
    {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    SplashScreen ss = new SplashScreen();
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

РЕДАКТИРОВАТЬ: Добавлен imageIcon.getImageLoadStatus() в цикле, но это не имеет никакого эффекта.

2 ответа

Попробуйте использовать JDK SplashScreen. Изображение загружается сразу для меня.

См. Как создать заставку.

Когда вы создаете ImageIcon, вы не загружаете изображение полностью в память в этот момент с помощью операции блокировки, ваш ClassLoader.getResource только возвращает вам URL. Читая подробности конструктора ImageIcon, он говорит, что запускает загрузку URL, но не блокирует. Вы можете проверить, когда изображение будет загружено с помощью метода imageIcon.getImageLoadStatus(). Когда это вернет, возможно, тогда установите window.setVisible(true).

Другие вопросы по тегам