Java tutorial
/* This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the license, or (at your option) any later version. */ import javax.swing.*; import java.awt.*; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; /** Dialog which displays indeterminate progress. @author <a href="mailto:jclasslib@ej-technologies.com">Ingo Kegel</a> @version $Revision: 1.1 $ $Date: 2003/08/18 07:46:43 $ */ public class ProgressDialog extends JDialog { private static final int PROGRESS_BAR_WIDTH = 200; private Runnable runnable; private JProgressBar progressBar; private JLabel lblMessage; /** * Constructor. * @param parent the parent frame. * @param runnable the <tt>Runnable</tt> to be started on <tt>setVisible</tt>. * @param message the initial status message. */ public ProgressDialog(JFrame parent, Runnable runnable, String message) { super(parent); init(runnable, message); } /** * Constructor. * @param parent the parent dialog. * @param runnable the <tt>Runnable</tt> to be started on <tt>setVisible</tt>. * @param message the initial status message. */ public ProgressDialog(JDialog parent, Runnable runnable, String message) { super(parent); init(runnable, message); } /** * Set the current status message. * @param message the message. */ public void setMessage(String message) { lblMessage.setText(message); } /** * Set the <tt>Runnable</tt> to be started on <tt>setVisible</tt>. * @param runnable the <tt>Runnable</tt>. */ public void setRunnable(Runnable runnable) { this.runnable = runnable; } public void setVisible(boolean visible) { if (visible) { progressBar.setIndeterminate(true); } else { progressBar.setIndeterminate(false); } super.setVisible(visible); } private void init(Runnable runnable, String message) { setupControls(); setupComponent(); setupEventHandlers(); setMessage(message); setRunnable(runnable); } private void setupControls() { progressBar = new JProgressBar(); Dimension preferredSize = progressBar.getPreferredSize(); preferredSize.width = PROGRESS_BAR_WIDTH; progressBar.setPreferredSize(preferredSize); lblMessage = new JLabel(" "); } private void setupComponent() { JPanel contentPane = (JPanel) getContentPane(); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.gridx = 0; gc.gridy = GridBagConstraints.RELATIVE; gc.anchor = GridBagConstraints.NORTHWEST; contentPane.add(lblMessage, gc); gc.weightx = 1; gc.fill = GridBagConstraints.HORIZONTAL; contentPane.add(progressBar, gc); setTitle(""); setModal(true); pack(); } private void setupEventHandlers() { addComponentListener(new ComponentAdapter() { public void componentShown(ComponentEvent event) { final Thread task = new Thread(runnable); task.start(); new Thread() { public void run() { try { task.join(); } catch (InterruptedException e) { } SwingUtilities.invokeLater(new Runnable() { public void run() { setVisible(false); } }); } }.start(); } }); } }