JavaFX 卡住窗口

标签 java multithreading javafx

当我过滤 TreeView (长过程)时遇到问题,我的应用程序卡住了。我尝试在单独的线程(Thread)中执行此操作,但随后出现错误“不在 FX 应用程序线程上;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");
                });
            }
        });
    }

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

P.s.我尝试用线程来做到这一点

//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");
        });

最佳答案

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

  //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();
            }
        });

关于JavaFX 卡住窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60143829/

相关文章:

java - 如何正确创建子类的新实例

java - 删除重复项放大错误

java - 解析mysql控制台输出

Python:引发异常且未处理后线程会被终止吗?

c++ - 非阻塞线程同步

c# - 为什么并发词典没有可见的 Add() 方法?

java - 获取 gridPane 中的按钮并使用 javaFx 更改其文本

java - invokeAndWait Java

java - 使用 Javafx 在 HBox 控件中垂直居中标签

java - JavaFX 条形图的 CSS 线性渐变