在另一个进程中或之前更改javaFX中的Text

时间:2016-01-17 21:12:43

标签: java multithreading javafx

    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。

这是使用线程的最后一次尝试。但它也没有达到目标。 给我一些建议。

1 个答案:

答案 0 :(得分:0)

你的方法完全错了。您正在“生成”另一个线程,并且您正在尝试从该线程更新JavaFX UI。与Swing或SWT相同,JavaFX是一个单线程UI工具包,在FX应用程序线程之外更新它是不安全的(就像使用Text组件一样)。在这种情况下,使用类似于SwingWorker的{​​{3}}实用程序类。在Task方法上运行所有后台任务。在您的情况下,您可以立即将dirStatus Text的文字更改为“正在搜索...”(按钮handle方法),然后启动“任务”。这样,您的UI将保持响应。完成任务后,您可以从call方法中删除“正在搜索...”(请注意,成功的方法在FX应用程序线程中运行,因此从那里更新Text非常安全)。 您可以阅读有关succeeded的更多信息。