java笔记--使用事件分配线程更新Swing控件
2014-08-14 09:52
459 查看
使用事件分配线程更新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 "谢谢--
代码实例:
注:在EventQueue中还定义了一个invokeAndWait()方法、事件放入到队列时,invokeLater()方法立即返回结果,
而run()方法在新线程中执行。invokeAndWait方法要等run()方法确实执行才会返回。SwingUtilities也提供了
相同的方法。
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也提供了
相同的方法。
相关文章推荐
- Java学习笔记---------如何使用Runnable接口来创建线程???
- 【Java学习笔记】53:JTree的使用(新选中事件和结点双击事件)
- 搬迁学习笔记1——Handler的基本使用、子线程更新UI的方式
- 学习java多线程的笔记3-使用BlockingQueue阻塞队列来模拟两个线程之间的通信
- Java多线程学习笔记1——线程的实现方式以及定时器的使用
- coco笔记:连续点击相应事件处理(使用协同)_ Java和C#
- 多线程异步编程(2):创建多个线程执行任务,同时更新进度条,使用观察者模式,利用事件通知界面更新。移除对Form的引用,彻底解除界面与逻辑的耦合
- Java Puzzlers笔记--puzzle 22:Dupe of URL url的使用
- Java 学习笔记 (9) - Java 事件机制 内部匿名类的应用
- Java入门笔记 6 线程
- Java 学习笔记 (5) - 线程 Thread
- 原创:关于一些Java开发工具的使用心得(不断更新)
- 明述java中线程(thread)的使用(1) 推荐
- java学习笔记_使用浮点数和小数中的技巧和陷阱
- 用Java线程获取优异性能(II)——使用同步连载线程访问关键代码部份
- 用Java线程获取优异性能(II)——使用同步连载线程访问关键代码部份
- java学习笔记,试用初学者,第二节,关于内存地址分配问题
- 孙鑫VC学习笔记:第十六讲 利用事件对象实现线程间的同步
- Oracle 10g使用笔记(不断更新中...2006年9月15日)
- 用Java线程获取优异性能(II)——使用同步连载线程访问关键代码部份