2012-01-29 233 views
0

我正在製作一個使用java.nio.file中的watchservice觀察文件夾的桌面應用程序。但是我需要在開始觀看之前加載gui,因爲要觀看的路徑位於UI上的JFieldText中。如何在繼續之前等待startup()中的屬性完成?

public class FileArchiverApp extends SingleFrameApplication { 

    static FileArchiverView gui; 

@Override protected void startup() { 
    gui = new FileArchiverView(this); //HERE0 I have to wait for this. 
    show(gui);  
... 
public static void main(String[] args) throws IOException { 
    launch(FileArchiverApp.class, args); 
.... 
    WatchService watcher = FileSystems.getDefault().newWatchService(); 
    // HERE1 while(gui==null) System.out.println("hi") ; 
    try { 
      Path dir = Paths.get(gui.getOriginPath()); // HERE2 I get nullpointer if gui was not ready 
      WatchKey key = dir.register(watcher, ENTRY_CREATE); 
    } catch (Exception x) { 
      System.err.println(x); 
    } 

    while(true){ /*wait for new file event loop*/ } 
} 

函數getOriginPath()從我提到的文本字段返回getText()。

在HERE0中是我提到的屬性。如果gui沒有準備好,我會在HERE2中獲得一個空指針。 我試過了。如果我把它放在HERE1中,它可以工作,但我當然不想那麼做。

我該怎麼做?

而且它需要很長的時間(比如兩秒鐘)或者gui才能停止與這個HERE1無效,我不知道是不是因爲println,但我期待它幾乎是瞬間的。這是正常的嗎?

謝謝。

+1

爲什麼使用基於JSR 296的'SingleFrameApplication'?它沒有被遺棄嗎?爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2012-01-29 05:01:46

回答

3

鑑於發佈的信息有限,我必須做出一些假設。假設1是您給JTextField一個默認值,並將其用作您希望觀看的文件的路徑。假設2是你沒有用MVC類型的設計來編碼。

如果兩者都是正確的,那麼它聽起來像你有尾巴搖擺狗 - 視圖持有關鍵數據,而不是模型。爲什麼不通過轉向MVC來解決問題,而不是從視圖而是從模型中獲取關鍵數據。首先啓動模型,包括從你的程序屬性中獲取默認路徑,讓你的監聽器繼續運行,開始你的視圖,然後如果視圖要求控制器改變觀察文件,讓控制器改變模型。然後模型中的聽衆會通知你任何觀察者的變化。

+0

有一個相關示例[此處](http://stackoverflow.com/a/5533581/230513)。 – trashgod 2012-01-29 06:01:57

+0

我喜歡有關良好做法的提示,但要求重寫所有代碼似乎不是一個好的答案。我解決了這個問題,只是把手錶服務放在另一個線程上,我可以隨時啓動它。 – galmeida 2012-02-02 11:27:18

+0

@galmeida:考慮到問題提供的信息非常有限,我可以做的最好。 – 2012-02-02 11:38:12

相關問題