メインプログラムによる大量のデータロード中にローダーを表示することに問題があります。その下には、ローダーの .gif アニメーションを表示するSplashScreenというクラスがあります。
public class SplashScreen extends JWindow {
public SplashScreen() {
super();
Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/load.gif"));
try {
if (image != null) {
JLabel imageLabel = new JLabel();
imageLabel.setIcon(new ImageIcon(image));
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(imageLabel, BorderLayout.CENTER);
this.pack();
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
Dimension labelSize = imageLabel.getPreferredSize();
setLocation(screenSize.width / 2 - (labelSize.width / 2),
screenSize.height / 2 - (labelSize.height / 2));
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
dispose();
}
});
addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
dispose();
}
});
}
} catch (Exception ex) {
}
}
このコードを実行すると、次の結果が得られます。
しかし、大量のデータ (たとえば 100 万レコード) をロードしたい場合は、次のようなものがあります。
Thread、EventQueue.invokeLater、および SwingUtilities を使用して SplashScreen を別の Thread で表示していましたが、機能しません。重いデータをロードすると、常に空白になります。残念ながら、EventQueue や SwingUtilities を使用するのは非常に難しいと言わざるを得ません。これらのユーティリティによって開始されたタスクを終了できないからです。