【问题标题】:JavaFX freeze windowJavaFX 冻结窗口
【发布时间】:2020-05-25 09:12:16
【问题描述】:

我在过滤树视图(长进程)时遇到问题,我的应用程序冻结了。我尝试在单独的线程(Thread)中执行此操作,但随后出现错误“Not on FX application thread; currentThread = Thread-5”

void InitBtnFind() {
        //Event Button Search
        btnFind.setOnAction(event -> {
            newFind();
            if (Config.isRoot()) {
                String finalSFilterExt = filterExt.getText();
                String finalSearchW = searchWord.getText();
                Platform.runLater(() -> {
                    try {
                        // imitation of work
                        Thread.sleep(5000);
                        fileView.setRoot(treeView.filterChanged(finalSFilterExt, finalSearchW));
                    } catch (IOException | InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("lol");
                });
            }
        });
    }

您可以提供一个示例代码来解决我的问题。 附:不要降低我的声誉,我对这件事很感兴趣

附:我尝试用线程来做到这一点

//Event Button Search
        btnFind.setOnAction(event -> {
            newFind();
            if (Config.isRoot()) {
                String finalSFilterExt = filterExt.getText();
                String finalSearchW = searchWord.getText();
                if (findThread != null && findThread.isAlive())
                    findThread.interrupt();
                findThread = new Thread(() -> {
                    try {
                        fileView.setRoot(treeView.filterChanged(finalSFilterExt, finalSearchW));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    System.out.println("lol");
                    });
                findThread.setName("findThread");
                findThread.setDaemon(true);
                findThread.start();
            }
            System.out.println("kek");
        });

【问题讨论】:

标签: java multithreading javafx


【解决方案1】:

我是这样修复的,我不知道它有多正确。但它对我有用。希望对你有用。

  //Event Button Search
        btnFind.setOnAction(event -> {
            newFind();
            if (Config.isRoot()) {
                String finalSFilterExt = filterExt.getText();
                String finalSearchW = searchWord.getText();
                if (findThread != null && findThread.isAlive())
                    findThread.interrupt();
                findThread = new Thread(() -> {
                    try {
                        Thread.sleep(2000);
                        System.out.println("++++++++++++++");
                        var q =treeView.filterChanged(finalSFilterExt, finalSearchW);
                        Platform.runLater(()->{fileView.setRoot(q);});
                    } catch (IOException | InterruptedException e) {
                        e.printStackTrace();
                    }
                    });
                findThread.setName("findThread");
                findThread.setDaemon(true);
                findThread.start();
            }
        });

【讨论】:

  • 只有当 treeView.filterChanged 不修改与场景图中的活动控件相关的任何内容时才足够安全...
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
相关资源
最近更新 更多