使用事件分配線程更新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也提供了
相同的方法。