EventQueue.invokelater的有关内容

代码:

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时,不会做其他任何事,因此就不会产生冲突。

你可能感兴趣的:(EventQueue.invokelater的有关内容)