java的例子都有这段代码SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        createAndShowGUI();
    }
},根据说明是如果是applet的程序可能会有影响,如果是桌面运行的话是不是不用加也可以?我们公司来了一个java设计的人,他设计的gui程序都没有这段代码(包括类似功能的),我说这样可能会出问题,他说不会,(这个人据说是gui的高手,还从国外留学回来的)哪位说说看

解决方案 »

  1.   

    我做SWING2年了,主要是桌面,上面的那段代码从来就没加过,从没见出问题。那段代码有可能是为了控制绘图的时候避免出现绘制不完全的情况。
      

  2.   

    这段代码是使run里面的代码放到事件分发线程里执行
    看下面的的例子(从thinking in java里的例子修改过来的)
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.lang.reflect.*;
    public class EventThreadFrame extends JFrame {
      private JTextField statusField =
        new JTextField("Initial Value");
      public EventThreadFrame() {
        Container cp = getContentPane();
        cp.add(statusField, BorderLayout.NORTH);
        addWindowListener(new WindowAdapter() {
          public void windowOpened(WindowEvent e) {
            try { // Simulate initialization overhead
              Thread.sleep(2000);
      statusField.setText("Initialization complete");
      Thread.sleep(2000);
            } catch (InterruptedException ex) {
              throw new RuntimeException(ex);
            }
                  }
        });
      }
      public static void main (String[] args) {
        final EventThreadFrame etf = new EventThreadFrame();
        JFrame mainFrame = etf;
    mainFrame.pack();
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setLocationRelativeTo(null);
    mainFrame.setVisible(true); 
    // etf.statusField.setText("Application ready");//情况1.
    SwingUtilities.invokeLater(new Runnable(){
    public void run(){
    etf.statusField.setText("Application ready");
    }
    });//情况2.
    /* try{
    SwingUtilities.invokeAndWait(new Runnable(){
    public void run(){
    etf.statusField.setText("Application ready");
    }
    });
    }catch(InterruptedException e){
    e.printStackTrace();
    }catch(InvocationTargetException e){
    e.printStackTrace();
    }*///情况3.
        System.out.println("Done");
      }
    }
    例子中如果不用SwingUtilities.......,那么main线程和事件分发线程都会修改label的文字
    自己试一下三种情况的不同