我编写了一个JWindow,它可以作为桌面应用程序的启动画面。我遇到的问题是,在窗口变得可见之后,在显示预期图像之前它暂时是空白的。空白窗口有时保持在0.5秒到2秒之间。我想在窗口变得可见之前完全呈现内容。
我使用Java 1.6在MacOS上。
这是我启动后的窗口:
半秒后,它显示了图像。图像非常小(大约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(),但它没有效果。
答案 0 :(得分:1)
尝试使用JDK SplashScreen。图像会立即为我加载。
答案 1 :(得分:0)
构造ImageIcon时,您没有使用阻塞操作将图像完全加载到内存中,ClassLoader.getResource只返回一个URL。阅读constructor details of ImageIcon它说它开始加载URL,但不会阻止。您可以通过imageIcon.getImageLoadStatus()方法检查图像的加载时间。当返回完成时,可能然后设置window.setVisible(true)。