Swing invoke later
/* Code from Desktop Java Live Source URL: http://www.sourcebeat.com/downloads/ */ import javax.swing.*; import java.awt.event.ActionEvent; public class InvokeLaterExample extends JPanel { private JLabel statusArea; private DefaultListModel listModel; public InvokeLaterExample() { JButton button = new JButton(new LongRunningModelFillAction()); add(button); JList list = new JList(); this.listModel = new DefaultListModel(); this.listModel.addElement("An Empty List Model"); list.setModel(listModel); add(new JScrollPane(list)); add(new JLabel("Status:")); this.statusArea = new JLabel(); add(this.statusArea); } private class LongRunningModelFillAction extends AbstractAction { public LongRunningModelFillAction() { super("Fill Model"); } public void actionPerformed(ActionEvent e) { InvokeLaterExample.this.listModel.removeAllElements(); InvokeLaterExample.this.listModel.addElement("Calculating..."); PopulationRunnable populationRunnable = new PopulationRunnable(); Thread populationThread = new Thread(populationRunnable); populationThread.start(); } } private class PopulationRunnable implements Runnable { public void run() { final Object[] values = new Object[100]; for (int i = 1; i <= 100; i++) { values[i - 1] = "Value" + i; if ((i % 10) == 0) { final int progress = i; SwingUtilities.invokeLater(new Runnable() { public void run() { InvokeLaterExample.this.statusArea.setText("Calculated " + progress); } }); } try { Thread.sleep(50); } catch (InterruptedException e) { } } SwingUtilities.invokeLater(new Runnable() { public void run() { InvokeLaterExample.this.statusArea.setText(""); InvokeLaterExample.this.listModel.removeAllElements(); for (int i = 0; i < values.length; i++) { InvokeLaterExample.this.listModel.addElement(values[i]); } } }); } } public static void main(String[] a){ JFrame f = new JFrame(); f.setDefaultCloseOperation(1); f.add(new InvokeLaterExample()); f.pack(); f.setVisible(true); } }