首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WatchService冻结JavaFX图形用户界面

WatchService冻结JavaFX图形用户界面
EN

Stack Overflow用户
提问于 2014-09-26 00:42:20
回答 2查看 1.1K关注 0票数 1

我有一个JavaFX应用程序,它必须在文件被重命名时触发。我是WatchService的新手,我已经完成了演示,并且它工作正常。

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

主类:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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;
                }
            }
        }
    }
}

我遇到的问题是,它可以工作,但我的GUI立即冻结。因此,我将watchdirectory.Register();放在一个RunLater中,希望它不会影响主JavaFX应用程序线程。

(我知道它是有效的,因为每当我在"D:\Test“中创建/重命名一个文件时,输出都会一直响应"Create triggered!")

EN

回答 2

Stack Overflow用户

发布于 2014-09-26 01:02:44

谢谢你的建议James_D

我已经把WatchDirectory变成了一个可运行的。在我的主类中,我用

代码语言:javascript
复制
new Thread(watchdirectory).start();

我以前使用过这个解决方案,但后来我使用了.run();,它再次冻结了图形用户界面。没有意识到.start()和.run()之间的区别;

别再有第二次!

票数 1
EN

Stack Overflow用户

发布于 2015-11-24 23:55:40

Platform.runLater()的目的是在某个时刻执行(),让FX应用程序进程执行,以运行其他一些运行的小程序,存在,执行返回FX应用程序。

你绝对不能这样做:

代码语言:javascript
复制
 while(true) {
    key = watchService.take();  
    ...
 }

使用Platform.runLater()时的轮询循环。

取而代之的是,你必须用像TimeLine这样的FX组件替换while(true),它每秒都会触发事件。忘了Runnable和Platform.runLater()吧,我认为要让它工作,你需要在FX中执行轮询循环。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26043835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档