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