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也提供了
相同的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM