JavaFXGUI冻结

JavaFXGUI冻结,java,javafx,Java,Javafx,在我们学校的最新项目中,我遇到了一些问题。我想观察新条目的路径,路径由文件控制器按钮选择,但如果我选择任何文件,整个窗口将冻结。。。我猜它在调用“observePath”方法时被冻结了,但我不知道如何解决这个问题 代码如下: public void start() { public Path absolutePath; final Label labelSelectedDirectory = new Label(); Button btnOpenDirectoryCho

在我们学校的最新项目中,我遇到了一些问题。我想观察新条目的路径,路径由文件控制器按钮选择,但如果我选择任何文件,整个窗口将冻结。。。我猜它在调用“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();
        }

    }
public void start(){
公共路径绝对路径;
最终标签SelectedDirectory=新标签();
按钮btnOpenDirectoryChooser=新建按钮();
btnOpenDirectoryChooser.setText(“开放式目录选择器”);
btnOpenDirectoryChooser.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
DirectoryChooser DirectoryChooser=新的DirectoryChooser();
文件选择目录=
directoryChooser.showDialog(primaryStage);
if(selectedDirectory==null){
labelSelectedDirectory.setText(“未选择目录”);
}否则{
labelSelectedDirectory.setText(selectedDirectory.getAbsolutePath());
绝对路径=selectedDirectory.toPath();
试一试{
观测路径();
}捕获(IOException | InterruptedException e){
e、 printStackTrace();
}
}
}
});
public void observePath()引发IOException、InterruptedException{
WatchService watcher=FileSystems.getDefault().newWatchService();
FileSystem fs=FileSystems.getDefault();
Path p=fs.getPath(absolutePath.toString());
WatchKey key=p.register(watcher,StandardWatchEventKinds.ENTRY\u CREATE);
key=watcher.take();
for(WatchEvent事件:key.pollEvents()){
if(event.kind()==StandardWatchEventKinds.ENTRY\u CREATE){
System.out.println(“发现新数据”);
}
否则{
System.out.println(“未找到新数据”);
}
}键。重置();
}
}
我希望有人能帮助我。 多谢各位


Tom

如果您的observePath方法工作量很大,您应该在新线程中执行它

new Thread( ()->{
 observePath();
}).start();
事件处理程序在负责更新UI的JavaFXApplicationRead中执行。您不应该在此线程中执行任何长期任务,否则您将体验到功能损失


有关应用程序线程的更多信息可在此处找到

欢迎使用StackOverflow,第一步是在每行之后添加一些调试代码,您将很快找到它冻结的位置。更新您的问题,以指向它冻结的特定部分,希望我们能够指出正在发生的事情的解决方案。
watcher.take()是一个阻塞操作。此代码必须在单独的线程中执行。