0

デスクトップ・アプリケーションのスプラッシュ画面として機能する JWindow を作成しました。私が抱えている問題は、ウィンドウが表示された後、意図した画像を表示する前に一時的に空白になることです。空白のウィンドウが 0.5 秒から 2 秒の間残ることがあります。ウィンドウが表示される前に、コンテンツを完全にレンダリングしたいと思います。

Java 1.6 を使用して MacOS を使用しています。

起動直後のウィンドウは次のとおりです。

ここに画像の説明を入力

わずか 0.5 秒後に画像が表示されます。画像はかなり小さいです (約 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();
                }
            }
        });
    }
}

EDIT : ループに imageIcon.getImageLoadStatus() を追加しましたが、効果はありません。

4

2 に答える 2

1

JDK SplashScreen を使用してみてください。画像はすぐに読み込まれます。

スプラッシュ スクリーンの作成方法 を参照してください。

于 2014-03-03T19:15:33.637 に答える
0

ImageIcon を構築するとき、その時点でブロック操作で画像をメモリに完全にロードしていないため、ClassLoader.getResource は URL のみを返します。ImageIconのコンストラクターの詳細を読み取ると、URL の読み込みが開始されますが、ブロックされません。imageIcon.getImageLoadStatus()メソッドで、画像の読み込みがいつ完了したかを確認できます。それが完了したら、おそらく window.setVisible(true) を設定します。

于 2014-03-03T18:56:04.187 に答える