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).