首页 > 代码库 > 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也提供了
相同的方法。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。