2012-01-29 133 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

相关问题