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