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

你可能感兴趣的:(swing)