我正在制作一个桌面应用程序,它使用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,但我期待它几乎是瞬间完成的。这是正常的吗?
感谢。
答案 0 :(得分:3)
鉴于发布的信息有限,我必须做出一些假设。假设1是您为JTextField提供一个默认值,并将其用作您要观看的文件的路径。假设2是你没有着眼于类似MVC的设计。
如果两者都是正确的,那么听起来就像你的尾巴摇着狗 - 持有关键数据的视图,而不是模型。为什么不通过转向MVC来解决问题,而不是从视图中获取关键数据,而是从模型中获取关键数据。首先启动模型,包括从程序属性获取默认路径,让听众进入,启动视图,然后如果视图要求控制器更改监视文件,让控制器更改模型。然后,模型中的听众将通知您任何观察者的变化。