在我们学校的最新项目中,我遇到了一些问题。我想观察新条目的路径,该路径是由文件管理器按钮选择的,但是如果我选择任何文件,则整个窗口都会冻结...我猜它被冻结了,因为调用了“ 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();
}
}
我希望有一个人可以帮助我。
非常感谢你
汤姆
最佳答案
如果observePath方法执行繁重的工作,则应在新的线程中执行它。
new Thread( ()->{
observePath();
}).start();
事件处理程序在JavafxApplicationThread中执行,该程序负责更新UI。您不应在该线程中执行任何长期任务,否则会遇到功能损失。
有关应用程序线程的更多信息,请参见此处How JavaFX application thread works?
关于java - Java FX GUI卡住,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52401543/