Java FX GUI冻结

TDI*_*TDI 2 java javafx

在我们学校的最新项目中,我遇到了一些问题.我想观察一个新条目的路径,路径是由文件控制器按钮选择的,但是如果我选择任何文件,整个窗口会冻结...我猜它被冻结了,因为"observePath"方法被调用但是我不知道我知道如何解决这个问题.

这是代码:

public void start() {

    public Path absolutePath;
    final Label labelSelectedDirectory = new Label();
    Button btnOpenDirectoryChooser = new Button();
    btnOpenDirectoryChooser.setText("Open DirectoryChooser");

    btnOpenDirectoryChooser.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            DirectoryChooser directoryChooser = new DirectoryChooser();

            File selectedDirectory =
                    directoryChooser.showDialog(primaryStage);

            if(selectedDirectory == null) {
                labelSelectedDirectory.setText("No Directory selected");

            }else{
                labelSelectedDirectory.setText(selectedDirectory.getAbsolutePath());
                absolutePath = selectedDirectory.toPath();
                try {

                    observePath();

                } catch (IOException | InterruptedException e) {

                    e.printStackTrace();
                }
            }
        }
    });

public void observePath() throws IOException, InterruptedException {

        WatchService watcher = FileSystems.getDefault().newWatchService();
        FileSystem fs = FileSystems.getDefault();
        Path p = fs.getPath(absolutePath.toString());

        WatchKey key = p.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);


            key = watcher.take();
            for (WatchEvent event : key.pollEvents()) {
                if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                    System.out.println("found new data");
                }
                else {
                    System.out.println("no new data found");
                }
            }key.reset();
        }

    }
Run Code Online (Sandbox Code Playgroud)

我希望有一个人可以帮助我.非常感谢你

汤姆

Kil*_*ian 5

如果您的observePath方法做了大量工作,您应该在新的Thread中执行它.

new Thread( ()->{
 observePath();
}).start();
Run Code Online (Sandbox Code Playgroud)

事件处理程序在JavafxApplicationThread中执行,后者负责更新UI.你不应该在这个线程中做任何持久的任务,否则你会遇到功能损失.

关于应用程序线程的更多信息可以在这里找到JavaFX应用程序线程如何工作?