2014-01-12 62 views
1

我需要編寫程序來顯示2個不同JTextArea中的線程給出的時間。時間每隔一段隨機的時間更新一次。此外,線程可以停止按鈕,並再次叮叮噹噹地恢復。我有其他班級的所有圖形用戶界面。2個主題和2個JTextArea

我的問題: 如何在其他類中添加對JTextArea的引用? 如何停止線程並使用按鈕繼續?

這裏從Thread類代碼:

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import javax.swing.JTextArea; 

public class MyThread implements Runnable { 
    StopResume main = new StopResume(); 
    String name; 
    Thread t; 
    JTextArea a; 

    String date; 
    DateFormat to = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
    Date today = Calendar.getInstance().getTime(); 

    public MyThread(String threatName) { 
     name = threatName; 
     t = new Thread(this, name); 
     t.start(); 
    } 

    public static void main(String[] args) { 
     //area1.append(date); 
     //area2.append(date); 
     //date = to.format(today); 
    } 


    @Override 
    public void run() { 
     try { 
     for(int i = 0; i < 20; i++){ 
      t.sleep(1000); 

      } 
     }catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

回答

1

您的問題,我的答案在嘗試:

我的問題:如何在其他類中添加引用的JTextArea?

我建議你不要一般情況下,一個對象不應該直接操縱另一個對象的字段。而是讓你的線程持有對GUI的引用,並讓它調用GUI的公共方法,該方法接受一個字符串,並在其中GUI將附加到JTextArea。此外,請確保只在Swing事件線程或EDT上調用此方法。這可以通過調用SwingUtilities.invokeLater(yourRunnable)排隊Runnable到EDT來完成。或者更好 - 使用SwingWorker。欲瞭解更多信息,請閱讀Concurrency in Swing Tutorial

如何停止線程和按鈕繼續?

給控制類(ActionListener的類)的線程的引用,並在ActionListener的,調用public方法是停止或恢復線程的while循環(可能通過改變布爾變量)。


其它注意事項:

  • 我看不出有任何的隨意性您Thread.sleep(...)延遲時間。你需要給你的MyThread類一個Random對象,並用它來改變Thread.sleep(...)次?
  • 我看到你正在使用for循環而不是while循環 - 你確定你應該這樣做嗎?
  • 我沒有看到你的線程類有任何機制來暫停它的循環。再次檢查並更改布爾條件的while循環可能會更好 - 取決於您。
  • 您的線程類創建StopResume對象的自己的副本。如果這是您的主要GUI,那麼您正在爲自己設置麻煩。您應該通過對顯示的 GUI的有效引用,可能通過此線程類的構造函數。
+0

好的。我添加隨機,而lloop。那麼如何更改線程構造函數來傳遞對GUI的引用呢? – sokol

+0

@sokol:大多數構造函數如何獲得傳遞給它們的引用?我問這個問題是因爲這是一個基本的核心Java概念,你應該也可能已經知道了。 –