Solution: Use the SwingWorker class, part of java 6.
Example:
private Document doc; ... JButton button = new JButton("Load"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { SwingWorker<Document, Void> worker = new SwingWorker<Document, Void>() { @Override public Document doInBackground() { return load(); } @Override public void done() { try { doc = get(); } catch (Exception e) { e.printStackTrace(); } } }; worker.execute(); } });