package org.docear.plugin.core.ui; import java.awt.BorderLayout; import java.awt.Frame; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.border.EmptyBorder; import org.jdesktop.swingworker.SwingWorker; public class SwingWorkerDialogLite extends JDialog implements PropertyChangeListener { /** * */ private static final long serialVersionUID = 1L; private final JPanel contentPanel = new JPanel(); private ExecutorService executor; private SwingWorker<?,?> thread; private JProgressBar progressBar; private JLabel labelHeadline; /** * Launch the application. */ public void showDialog(SwingWorker<?,?> thread) { executor = Executors.newSingleThreadExecutor(); this.thread = thread; thread.addPropertyChangeListener(this); executor.execute(thread); this.setVisible(true); } public SwingWorkerDialogLite() { init(); } public SwingWorkerDialogLite(Frame parent) { super(parent); init(); this.setHeadlineText(""); this.setLocationRelativeTo(parent); } /** * Create the dialog. */ private void init() { setResizable(false); setModal(true); setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); setBounds(100, 100, 450, 83); getContentPane().setLayout(new BorderLayout()); contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); getContentPane().add(contentPanel, BorderLayout.CENTER); contentPanel.setLayout(new BorderLayout(0, 0)); { JPanel panel = new JPanel(); contentPanel.add(panel); panel.setLayout(new BorderLayout(0, 0)); { labelHeadline = new JLabel("<HeadLine>"); panel.add(labelHeadline, BorderLayout.CENTER); } } { JPanel buttonPane = new JPanel(); buttonPane.setBorder(new EmptyBorder(5, 5, 5, 5)); getContentPane().add(buttonPane, BorderLayout.SOUTH); buttonPane.setLayout(new BorderLayout(5, 5)); { progressBar = new JProgressBar(); progressBar.setIndeterminate(true); buttonPane.add(progressBar); } } } public void setHeadlineText(String text){ this.labelHeadline.setText(text); } private void done() { // It's very important to set the thread and the executor = null, // because otherwise a reference is hold and the thread never finishes but keeps waiting. if(this.thread != null){ this.thread.cancel(true); this.thread = null; } if(this.executor != null){ this.executor.shutdownNow(); this.executor = null; } this.dispose(); } public void propertyChange(PropertyChangeEvent evt) { if(evt.getPropertyName().equals(SwingWorkerDialog.PROGRESS)){ progressBar.setValue((Integer)evt.getNewValue()); } if(evt.getPropertyName().equals(SwingWorkerDialog.SET_PROGRESS_BAR_INDETERMINATE)){ this.progressBar.setIndeterminate(true); this.repaint(); } if(evt.getPropertyName().equals(SwingWorkerDialog.SET_PROGRESS_BAR_DETERMINATE)){ this.progressBar.setIndeterminate(false); this.repaint(); } if(evt.getPropertyName().equals(SwingWorkerDialog.REPAINT)){ this.repaint(); } if(evt.getPropertyName().equals(SwingWorkerDialog.SET_HEADLINE)){ this.setHeadlineText("" + evt.getNewValue()); } if(evt.getPropertyName().equals(SwingWorkerDialog.IS_DONE)){ this.progressBar.setIndeterminate(false); this.progressBar.setValue(100); this.done(); } } }