Text dirStatus = new Text();
String mainPath = new String(); // path to finded dir
Stage preStage = new Stage();
public void preloader() throws IOException {
File [] root = File.listRoots();
Path startPath = root[0].toPath(); // find highest dir
Group preGroup = new Group();
dirStatus.setText("Press to start serch!");
dirStatus.setLayoutX(20);
dirStatus.setLayoutY(100);
Button dirFind = new Button("Serch");
dirFind.setLayoutX(180);
dirFind.setLayoutY(150);
preGroup.getChildren().add(dirStatus);
preGroup.getChildren().add(dirFind);
Scene preScene = new Scene(preGroup, 400, 200);
preStage.setScene(preScene);
preStage.show();
dirFind.setOnAction(new EventHandler() {
@Override
public void handle(Event event) {
Title title = new Title();
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
title.setPriority(Thread.MAX_PRIORITY);
title.run();
mainPath="";
PrintFiles pf = new PrintFiles();
try {
Files.walkFileTree(startPath, pf);
} catch (IOException e) {
e.printStackTrace();
}
if (mainPath!=""){
dirStatus.setText(dirStatus.getText() + " Finded!!!");
}
}
});
}
public class Title extends Thread {
public Title(){
}
public void run() {
System.out.println("Started");
dirStatus.setText("Serch in process...");
Thread.currentThread().interrupt();
}
}
public class PrintFiles extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
if (dir.endsWith("HUP")){
System.out.println("Finded");
mainPath=""+ dir;
System.out.println(mainPath);
dirStatus.setText(mainPath);
return FileVisitResult.TERMINATE;
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.err.println(exc);
return FileVisitResult.CONTINUE;
}
}
}
每个人都好。 这是我的代码的一部分,我试图让它更好。
我需要在单击按钮后将字段dirStatus更改为文本:“Serch in process ...”。
但在所有情况下,我尝试在完成PrintFiles类serchig目录后更改字段dirStatus。
这是使用线程的最后一次尝试。但它也没有达到目标。 给我一些建议。
答案 0 :(得分:0)
你的方法完全错了。您正在“生成”另一个线程,并且您正在尝试从该线程更新JavaFX UI。与Swing或SWT相同,JavaFX是一个单线程UI工具包,在FX应用程序线程之外更新它是不安全的(就像使用Text
组件一样)。在这种情况下,使用类似于SwingWorker
的{{3}}实用程序类。在Task方法上运行所有后台任务。在您的情况下,您可以立即将dirStatus
Text
的文字更改为“正在搜索...”(按钮handle
方法),然后启动“任务”。这样,您的UI将保持响应。完成任务后,您可以从call方法中删除“正在搜索...”(请注意,成功的方法在FX应用程序线程中运行,因此从那里更新Text
非常安全)。
您可以阅读有关succeeded的更多信息。