代码:
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ArrayMinValue frame = new ArrayMinValue();
frame.setVisible(true);//如果没有这行,你在屏幕上就什么都看不到;
} catch (Exception e) {
e.printStackTrace();
}
}
});
这个方法调用完毕后,它会被销毁,因为匿名内部类是作为临时变量存在的,给它分配的内存在此时会被释放。这个对于只需要在一个地方使用时可以节省内存,而且这个类是不可以被其它的方法或类使用的,只能被EventQueue.invokeLater()来使用。但如果你需要一个在很多地方都能用到的类,而不是只在某一个类里面或者方法里用的话,定义成匿名内部类显然是不可取的。 是,runnable是跟线程相关的类。
swingutilities.invokelater()和eventqueue.invokelater(),
后者可以不干扰到事件分发线程.
SwingUtilities版只是一个薄薄的封装方法,它直接转而调用 EventQueue.invokeLater。
因为Swing框架本身经常调用SwingUtilities,使用SwingUtilities可以减少程序引入的类
SwingUtilities类提供了两个方法:invokeLate和invoteAndWait,它们都使事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时,就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块。 只有从事件派发线程才能更新组件。
public class HelloSwing {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
JFrame frame=new JFrame("hello Swing");
JLabel label=new JLabel("A label");
frame.add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,100);
frame.setVisible(true);
TimeUnit.SECONDS.sleep(3);
label.setText("hey,this is default");
}
}
运行结果:
package learning;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class HelloSwing {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
JFrame frame=new JFrame("hello Swing");
JLabel label=new JLabel("A label");
frame.add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,100);
frame.setVisible(true);
TimeUnit.SECONDS.sleep(3);
//label.setText("hey,this is default");(用下列代码表示)
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// TODO Auto-generated method stub
label.setText("hey,this is default");
}
});
}
}
把label.setText(“hey,this is default”);变为 SwingUtilities.invokeLater(new Runnable() { public void run() { // TODO Auto-generated method stub label.setText("hey,this is default"); } });
就不用直接操作JLabel(直接操作JLabel会导致冲突和死锁),我们把任务交给SwingUtilities.invokeLater()来处理,这个方法会通过事件分发线程将任务放置到待执行事件队列中,你提交一个Runnable,当事件分发线程在队列中获取这项任务是,他将执行实际的操作,并且在执行这个Runnable时,不会做其他任何事,因此就不会产生冲突。