在显示图像之前,JWindow显示空白一秒钟

时间:2014-03-03 18:49:57

标签: java swing jwindow

我编写了一个JWindow,它可以作为桌面应用程序的启动画面。我遇到的问题是,在窗口变得可见之后,在显示预期图像之前它暂时是空白的。空白窗口有时保持在0.5秒到2秒之间。我想在窗口变得可见之前完全呈现内容。

我使用Java 1.6在MacOS上。

这是我启动后的窗口:

enter image description here

半秒后,它显示了图像。图像非常小(大约95kBytes JPG)。我知道问题不是ImageIcon加载,因为构造函数应该阻塞,直到加载图像。

enter image description here

这是我的代码:

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 个答案:

答案 0 :(得分:1)

尝试使用JDK SplashScreen。图像会立即为我加载。

请参阅How to Create a Splash Screen

答案 1 :(得分:0)

构造ImageIcon时,您没有使用阻塞操作将图像完全加载到内存中,ClassLoader.getResource只返回一个URL。阅读constructor details of ImageIcon它说它开始加载URL,但不会阻止。您可以通过imageIcon.getImageLoadStatus()方法检查图像的加载时间。当返回完成时,可能然后设置window.setVisible(true)。