title: Java Event-Dispatch Thread example program hangs
body: <p>I have read this article on the EDT (Event Dispatch Thread) <a href="http://www.javaworld.com/community/node/7717" rel="nofollow">javaworld.com</a> which shows how to correctly setup a Swing GUI on the EDT and put long running tasks which modify the GUI inside Runnables.</p>
  
  <p>It all makes sense however the example program (I pasted below) where the only modification I made is a Thread.sleep(6000) to simulate a long lag makes the interface irresponsive for some seconds.</p>
  
  <p>Am I missing something?</p>
  
  <pre><code>import java.awt.BorderLayout;
  import java.awt.EventQueue;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.io.IOException;
  import java.io.InputStream;
  import java.lang.reflect.InvocationTargetException;
  import java.net.URL;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  import javax.swing.JFrame;
  import javax.swing.JLabel;
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  import javax.swing.JTextArea;
  import javax.swing.JTextField;
  
  public class ViewPage
  {
  
      public static void main(String[] args)
      {
          Runnable r;
          r = new Runnable()
          {
              @Override
              public void run()
              {
                  final JFrame frame = new JFrame("View Page");
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  JPanel panel = new JPanel();
                  panel.add(new JLabel("Enter URL"));
                  final JTextField txtURL = new JTextField(40);
                  panel.add(txtURL);
                  frame.getContentPane().add(panel, BorderLayout.NORTH);
                  final JTextArea txtHTML = new JTextArea(10, 40);
                  frame.getContentPane().add(new JScrollPane(txtHTML),
                          BorderLayout.CENTER);
                  ActionListener al;
                  al = new ActionListener()
                  {
                      public void actionPerformed(ActionEvent ae)
                      {
                          txtURL.setEnabled(false);
                          Runnable worker = new Runnable()
                          {
                              public void run()
                              {
                                  InputStream is = null;
                                  try
                                  {
                                      URL url = new URL(txtURL.getText());
                                      is = url.openStream();
                                      final StringBuilder sb;
                                      sb = new StringBuilder();
                                      int b;
                                      while ((b = is.read()) != -1)
                                      {
                                          sb.append((char) b);
                                      }
                                      Runnable r = new Runnable()
                                      {
                                          public void run()
                                          {
                                              try
                                              {
                                                  Thread.sleep(6000);
                                              }
                                              catch (InterruptedException ex)
                                              {
                                                  Logger.getLogger(ViewPage.class.getName()).log(Level.SEVERE, null, ex);
                                              }
                                              txtHTML.setText(sb.toString());
                                              txtURL.setEnabled(true);
                                          }
                                      };
                                      try
                                      {
                                          EventQueue.invokeAndWait(r);
                                      }
                                      catch (InterruptedException ie)
                                      {
                                      }
                                      catch (InvocationTargetException ite)
                                      {
                                      }
                                  }
                                  catch (final IOException ioe)
                                  {
                                      Runnable r = new Runnable()
                                      {
                                          public void run()
                                          {
                                              txtHTML.setText(ioe.getMessage());
                                              txtURL.setEnabled(true);
                                          }
                                      };
                                      try
                                      {
                                          EventQueue.invokeAndWait(r);
                                      }
                                      catch (InterruptedException ie)
                                      {
                                      }
                                      catch (InvocationTargetException ite)
                                      {
                                      }
                                  }
                                  finally
                                  {
                                      Runnable r = new Runnable()
                                      {
                                          public void run()
                                          {
                                              txtHTML.setCaretPosition(0);
                                              txtURL.setEnabled(true);
                                          }
                                      };
                                      try
                                      {
                                          EventQueue.invokeAndWait(r);
                                      }
                                      catch (InterruptedException ie)
                                      {
                                      }
                                      catch (InvocationTargetException ite)
                                      {
                                      }
                                      if (is != null)
                                      {
                                          try
                                          {
                                              is.close();
                                          }
                                          catch (IOException ioe)
                                          {
                                          }
                                      }
                                  }
                              }
                          };
                          new Thread(worker).start();
                      }
                  };
                  txtURL.addActionListener(al);
                  frame.pack();
                  frame.setVisible(true);
              }
          };
          EventQueue.invokeLater(r);
      }
  }
  </code></pre>