使用事件分配线程更新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控件
时间: 2024-11-03 21:15:12