Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WatchService冻结JavaFXGUI_Java_User Interface_Javafx_Freeze_Watchservice - Fatal编程技术网

WatchService冻结JavaFXGUI

WatchService冻结JavaFXGUI,java,user-interface,javafx,freeze,watchservice,Java,User Interface,Javafx,Freeze,Watchservice,我有一个JavaFX应用程序,每当文件被重命名时都必须触发它。我是WatchService的新手,我已经做了演示,效果不错 尽管如此,这个演示是一个简单的应用程序,只有一个类。现在我想在我自己的应用程序中实现它,创建一个单独的类来处理WatchService 主要类别: public class KochFractalDraw extends Application { @Override public void start(Stage primaryStage) th

我有一个JavaFX应用程序,每当文件被重命名时都必须触发它。我是WatchService的新手,我已经做了演示,效果不错

尽管如此,这个演示是一个简单的应用程序,只有一个类。现在我想在我自己的应用程序中实现它,创建一个单独的类来处理WatchService

主要类别:

public class KochFractalDraw extends Application {
     @Override
        public void start(Stage primaryStage) throws IOException, InterruptedException {

                          //..define GUI etc..

            watchdirectory = new WatchDirectory();
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        watchdirectory.Register();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(JSF31KochFractalFX.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
    }
使用WatchDirectory:

public class WatchDirectory {

    WatchService watchService;
    Path path;
    WatchKey key;

    public WatchDirectory() throws IOException {

        this.watchService = FileSystems.getDefault().newWatchService();
        path = Paths.get("D:\\Test");
        path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
    }

    public void Register() throws InterruptedException {
        for (;;) {

            this.key = watchService.take();
            for (WatchEvent<?> event : key.pollEvents()) {
                WatchEvent.Kind kind = event.kind();
                switch (kind.name()) {
                    case "ENTRY_CREATE":
                        System.out.println("Create triggered!");
                        break;
                    default:
                        System.out.println("Wrong event called.");
                        break;
                }

                boolean valid = key.reset();

                if (!valid) {
                    break;
                }
            }
        }
    }
}
公共类监视目录{
WatchService WatchService;
路径;
监视键;
public WatchDirectory()引发IOException{
this.watchService=FileSystems.getDefault().newWatchService();
path=path.get(“D:\\Test”);
注册(watchService、StandardWatchEventKinds.ENTRY\u CREATE);
}
public void Register()引发InterruptedException{
对于(;;){
this.key=watchService.take();
for(WatchEvent事件:key.pollEvents()){
WatchEvent.Kind-Kind=event.Kind();
开关(kind.name()){
案例“条目创建”:
System.out.println(“创建已触发!”);
打破
违约:
System.out.println(“调用了错误的事件”);
打破
}
布尔有效值=key.reset();
如果(!有效){
打破
}
}
}
}
}
我遇到的问题是它可以工作,但我的GUI立即冻结。因此,我将watchdirectory.Register()放在;在RunLater中,希望它不会影响主JavaFX应用程序线程


(我知道它是有效的,因为每当我在“D:\Test”中创建/重命名一个文件时,输出将继续响应“create triggered!”)

谢谢您的提示

我已使WatchDirectory成为可运行目录。 在我的主课上,我和

new Thread(watchdirectory).start();
以前我接近这个解决方案,但后来我使用了.run(),这再次冻结了GUI。没有意识到.start()之间的区别;and.run()

再也不会了

Platform.runLater()旨在在某个点执行FX应用程序进程,以运行其他运行的小程序,并且存在,然后执行返回FX应用程序

如果在这个过程中有无限循环,比如如何使用Watch服务,执行将永远不会返回,FX应用程序自然会冻结

你绝对不能这样做:

 while(true) {
    key = watchService.take();  
    ...
 }
使用Platform.runLater()时轮询循环

相反,您必须用一些FX组件(如每秒触发事件的时间线)替换
while(true)
。忘记Runnable和
Platform.runLater()
,我认为要让它工作,您需要在FX中执行轮询循环


到目前为止,我还没有想出如何做到这一点

嗯,我不太确定runlater,但根据我自己的经验,如果你想从一个框架调用沉重的东西,那么就调用runnable,当runnable完成时,它应该调用Platform.runlater runnable,这是一个UI处理程序,主要是
Platform.runlater(…)
计划在FX应用程序线程上运行某些内容,这与您想要的正好相反。