如何等待启动()中的归因在继续之前完成?

时间:2012-01-29 04:51:06

标签: java swing netbeans startup wait

我正在制作一个桌面应用程序,它使用java.nio.file中的watchservice来监视文件夹。但是在开始观看之前我需要加载gui,因为要观看的路径是在UI上的JFieldText中。

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中得到一个nullpointer。 我试过了。如果我把这个东西放在HERE1中它可以工作,但我当然不想这样做。

我怎么能做到?

它花了很长时间(比如两秒钟)或者用这个HERE1停止为空的gui我不知道是不是因为println,但我期待它几乎是瞬间完成的。这是正常的吗?

感谢。

1 个答案:

答案 0 :(得分:3)

鉴于发布的信息有限,我必须做出一些假设。假设1是您为JTextField提供一个默认值,并将其用作您要观看的文件的路径。假设2是你没有着眼于类似MVC的设计。

如果两者都是正确的,那么听起来就像你的尾巴摇着狗 - 持有关键数据的视图,而不是模型。为什么不通过转向MVC来解决问题,而不是从视图中获取关键数据,而是从模型中获取关键数据。首先启动模型,包括从程序属性获取默认路径,让听众进入,启动视图,然后如果视图要求控制器更改监视文件,让控制器更改模型。然后,模型中的听众将通知您任何观察者的变化。