Java 如何等待startup()中的属性完成后再继续?

Java 如何等待startup()中的属性完成后再继续?,java,swing,netbeans,startup,wait,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 FileArchive

我正在制作一个桌面应用程序,它使用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()

这里0是我提到的属性。如果gui没有准备好,我会在这里得到一个空指针。 我试过了。如果我把那东西放在这里,它会起作用,但我当然不想那样做

我怎么能做到

它需要很长时间(比如两秒钟)或者gui停止为空,我不知道这是否是因为println,但我希望它几乎是瞬时的。这正常吗


谢谢。

鉴于发布的信息有限,我不得不做出一些假设。假设1是给JTextField一个默认值,并将其用作要查看的文件的路径。假设2是,您的编码没有着眼于MVC式的设计


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

鉴于发布的信息有限,我必须做出一些假设。假设1是给JTextField一个默认值,并将其用作要查看的文件的路径。假设2是,您的编码没有着眼于MVC式的设计


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

为什么要使用基于JSR 296的
SingleFrameApplication
?它不是被遗弃了吗?为了更快地获得更好的帮助,请发布一篇文章。为什么要使用基于JSR296的
SingleFrameApplication
?它不是被遗弃了吗?为了更快地获得更好的帮助,发布一篇文章。我喜欢关于良好实践的提示,但要求重写所有代码似乎不是一个好的答案。我只是把手表服务放在另一个线程上就解决了这个问题,我可以随时启动。@galmeida:鉴于问题提供的信息非常有限,这是我能做的最好的了。我使用的修复方法不是可以从我提供的信息中想象出来的吗?我喜欢关于良好实践的提示,但是要求重写所有代码似乎不是一个好答案。我只是把手表服务放在另一个线程上就解决了这个问题,我可以随时启动它。@galmeida:鉴于问题提供的信息非常有限,这是我所能做的最好的了。我使用的修复方法不是可以从我提供的信息中想象出来的吗?