java 线程 更新控件_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也提供了

相同的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值