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也提供了
相同的方法。
java笔记--使用事件分配线程更新Swing控件的更多相关文章
- (转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例
http://2sharings.com/2014/net-4-5-task-run-parallel-for-winform-cross-multiple-threads-update-ui-dem ...
- C#子线程更新UI控件的方法总结
http://blog.csdn.net/jqncc/article/details/16342121 在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从 ...
- C# 后台线程更新UI控件
/********************************************************************************* * C# 后台线程更新UI控件 * ...
- C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...
- C# Winform 跨线程更新UI控件常用方法总结(转)
出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件 ...
- C# Winform 跨线程更新UI控件常用方法汇总
https://www.cnblogs.com/marshal-m/p/3201051.html
- Visual studio之C#跨线程调用UI控件
背景 当前串口通讯项目,多个线程需要同时利用richTextBoxMsg控件打印信息,直接调用会造成线程不安全,严重的时候会直接导致UI线程挂掉,因此本篇就跨线程调用UI控件做个记录. 正文 定义控件 ...
- 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常
在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...
- Error-ASP.NET:由于未能找到 id 为“FileUpload1$gvFiles$ctl02$lnkBtnRemoveFile”的控件或在回发后将同一 ID 分配给另一个控件,导致发生错误。如果未分配 ID,请显式设置引发回发事件的控件的 ID 属性以避免此错误。
ylbtech-Error-ASP.NET:由于未能找到 id 为“FileUpload1$gvFiles$ctl02$lnkBtnRemoveFile”的控件或在回发后将同一 ID 分配给另一个控件 ...
随机推荐
- [codevs 1051]接龙游戏(栈)
题目:http://codevs.cn/problem/1051/ 分析: 当然单词查找树是可以的,但这题有更为简便的方法.可以先按字典序排序,然后弄一个栈,如果当前字串可以接到栈顶元素的后面,那么当 ...
- KMP和扩展KMP
文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...
- ThinkPHP中的跨控制器调用与框架执行流程
一.跨控制器调用 UserController.class.php <?php namespace Home/Controller use Think/Controller class User ...
- Grunt-cli的执行过程以及Grunt加载原理
通过本篇你可以了解到: 1 grunt-cli的执行原理 2 nodeJS中模块的加载过程 Grunt-cli原理 grunt-cli其实也是Node模块,它可以帮助我们在控制台中直接运行grunt命 ...
- datepicker自定义 -- iOS
/** * 创建时间选择器 */ - (void)createPickerView { self.datePicker = [[UIDatePicker alloc] init]; _datePick ...
- ORA-12737: Instant Client Light: unsupported server character set CHS16GBK/ZHS16GBK解决方案
二.Navicat for Oracle的配置 1.启动该工具,出现如下的开始界面,单击“连接”选项,进行连接数据库,如图所示: 6.在“新建连接”对话框中,输入任意的连接名,选择默认的连接类型,输入 ...
- 如何正确地使用Entity Framework Database First
毕设依旧在不紧不慢地以每天解决一个问题的进度进行中.今天遇到的问题就是在建立数据模型时遇到的.因为项目是基于数据库构建的,所以理所应当地采用DB First来构造实体类和DbContext类.于是想也 ...
- WebForm控件之DropDownList
DropDwonList 三件事: ------------------------------------------1.把内容填进去-------------------------------- ...
- WebService 入门程序(一)
第一步:定义webService接口 package com.robert.ws.service; import javax.jws.WebService; @WebService public in ...
- 【bzoj1042】 HAOI2008—硬币购物
http://www.lydsy.com/JudgeOnline/problem.php?id=1042 (题目链接) 题意 共有4种硬币,面值分别为c1,c2,c3,c4.某人去商店买东西,去了to ...