java笔记--使用事件分配线程更新Swing控件

使用事件分配线程更新Swing控件:

 

Swing并不是线程安全的,如果在多个线程中更新Swing控件,则很可能造成程序崩溃。
为了避免这种问题,可以使用时间分配线程来更新Swing控件。

 

EventQueue 是一个与平台无关的类,它将来自于底层同位体类和受信任的应用程序类的事件列入队列。
它封装了异步事件指派机制,该机制从队列中提取事件,然后通过对EventQueue调用dispatchEvent(AWTEvent)
方法来指派这些事件(事件作为参数被指派)。该机制的特殊行为是与实现有关的。为了将Swing程序在事件分配
线程中运行,需要使用invokeLater()方法:
    public static void invokeLater(Runnable runnable)
   此run方法应该在EventQueue上同步执行


注意:事件分配线程永远不需要使用可能发生阻塞的操作,如IO操作
--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3911806.html "谢谢--  
代码实例:

package com.xhj.thread;

import java.awt.Button;
import java.awt.EventQueue;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 使用事件分配线程更新Swing控件
 * 
 * @author XIEHEJUN
 * 
 */
public class EventThreadUpdateSwing {
    // 标识更新次数
    private int a = 0;
    private Label lable;
    private Button button;

    public void setLable(Label lable) {
        this.lable = lable;
    }

    public void setButton(Button button) {
        this.button = button;
    }

    public Label getLable() {
        return lable;
    }

    public Button getButton() {
        return button;
    }

    /**
     * 事件线程类
     */
    private class EnventThread implements Runnable {

        @Override
        public void run() {
            // 按钮监听,实现点击改变数值
            button.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    // 利用EnventQueue类来更新Swing控件
                    EventQueue.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            lable.setText(a++ + " 新生成的随机数是:"
                                    + new Random().nextInt());
                        }
                    });
                }
            });

        }

    }

    public static void main(String[] args) {
        EventThreadUpdateSwing etus = new EventThreadUpdateSwing();
        
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        frame.setContentPane(panel);
        frame.setVisible(true);
        etus.setLable(new Label("点击按钮生成随机数"));
        etus.setButton(new Button("开始生成"));
        frame.add(etus.getLable());
        frame.add(etus.getButton());
        
        EnventThread envent = etus.new EnventThread();
        new Thread(envent).start();

    }
}

注:在EventQueue中还定义了一个invokeAndWait()方法、事件放入到队列时,invokeLater()方法立即返回结果,
而run()方法在新线程中执行。invokeAndWait方法要等run()方法确实执行才会返回。SwingUtilities也提供了
相同的方法。

posted @ 2014-08-14 09:52  Liape  阅读(4755)  评论(0编辑  收藏  举报