TITLE:JDialogでモーダルなJPorgressBar付きSplash Screenを表示する

Posted by at 2009-11-09

JDialogでモーダルなJPorgressBar付きSplash Screenを表示する

JDialogでモーダルなJPorgressBar付きSplash Screenを表示します。

  • &jnlp;
  • &jar;
  • &zip;
ProgressSplashScreen.png

サンプルコード

final JFrame frame = new JFrame();
final JDialog splashScreen  = new JDialog(frame, Dialog.ModalityType.DOCUMENT_MODAL);
final JProgressBar progress = new JProgressBar();
EventQueue.invokeLater(new Runnable() {
  @Override public void run() {
    splashScreen.setUndecorated(true);
    splashScreen.getContentPane().add(
      new JLabel(new ImageIcon(getClass().getResource("splash.png"))));
    splashScreen.getContentPane().add(progress, BorderLayout.SOUTH);
    splashScreen.pack();
    splashScreen.setLocationRelativeTo(null);
    splashScreen.setVisible(true);
  }
});
SwingWorker<Void,Void> worker = new SwingWorker<Void,Void>() {
  @Override public Void doInBackground() {
    try{
      int current = 0;
      int lengthOfTask = 120;
      while(current<lengthOfTask && !isCancelled()) {
        try {
          Thread.sleep(50);
        }catch(InterruptedException ie) {
          ie.printStackTrace();
          return null;
        }
        setProgress(100 * current++ / lengthOfTask);
      }
    }catch(Exception ex) {
      ex.printStackTrace();
    }
    return null;
  }
  @Override public void done() {
    splashScreen.dispose();
  }
};
worker.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
  @Override public void propertyChange(java.beans.PropertyChangeEvent e) {
    if("progress".equals(e.getPropertyName())) {
      progress.setValue((Integer)e.getNewValue());
    }
  }
});
worker.execute();

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new MainPanel());
frame.pack();
frame.setLocationRelativeTo(null);
EventQueue.invokeLater(new Runnable() {
  @Override public void run() {
    frame.setVisible(true);
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、以下のようなスプラッシュスクリーンを表示しています。

  • モーダルなJDialogに、画像とJProgressBarを追加
  • Dialog#setUndecorated(true)として、タイトルバーを非表示
  • SwingWorkerを使って、進捗状態を表示

参考リンク

コメント