首页 > 代码库 > java笔记--使用事件分配线程更新Swing控件

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也提供了
相同的方法。