2008年1月3日 星期四

[Java] SwingUtilities.invokeLater

多執行緒程式畫出狀態回報狀態, 一直是令人頭痛的問題.
這東西不管是在 Windows 或 Java Programming 都會遇到.

總之,
讓程式的 main thread 負責使用者 UI 的動作, 其他需要一點時間的工作, 放在新的 thread 執行, 應該是一個很好的程式設計模型.
例如: while 或 loop 很久的副程式, 就應該放在新的 thread 中執行, 然後回報工作進度.

在 Windows 你可以用 PostMessage 來回報工作 thread 狀態.
然而, Java 呢?

請服用  invokeLater.
只要餵給他一個 工作 thread 物件, 他會在適當的時機, 把進度顯示的繪圖指令, 安排到系統中, 進行顯示.

下面是一個例子:
public class AA{
        xxxMethod(){
                  SwingUtilities.invokeLater(new JobTask());
                   // 繼續執行其他使用者介面工作
        }
}
class JobTask implements Runnable{
         JLabel myLabel;            
         public void run(){
                     while(true){
                                      // 高耗時工作
                                       ...
                                     myLabel.setText("回報進度");
                    }
         }
      public JobTask(JLabel label){
                       mylabel=label;
     }
}


by Jing

2 則留言:

  1. 您好, 謝謝您的例子讓我了解這個function的作用
    但例子中function名字拚錯了invodeLater (d -> k)
    提醒您一下
    感謝!

    回覆刪除