2016-01-17 38 views
0
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; 
     } 
    } 

} 

Hellow給大家。 這是我的代碼的一部分,我試着讓它變得更好。在另一個進程或之前更改javaFX中的文本

我需要將字段dirStatus更改爲文本:「正在處理...」,在鼠標點擊按鈕後。

但是在所有情況下,我嘗試在完成PrintFiles類serchig目錄後更改字段dirStatus。

這是線程使用的最後一次嘗試。但它沒有達到目標。 給我一些建議。

回答

0

你的方法是完全錯誤的。您正在「產生」一個線程,並且您正嘗試從該線程更新JavaFX UI。與Swing或SWT相同,JavaFX是一個單線程的UI工具包,在FX應用程序線程之外進行更新是不安全的(正如您對Text組件所做的那樣)。在像這樣的情況下,使用Task工具類,與SwingWorker類似。運行call方法的所有後臺任務。在您的情況下,您可以立即將dirStatusText的文本更改爲「正在搜索...」(在按鈕handle方法中),然後啓動「任務」。這樣,你的用戶界面將保持響應。任務完成後,您可以從方法中刪除「正在搜索...」(請注意,成功的方法在FX應用程序線程中運行,因此從此更新Text是完全安全的)。 你可以閱讀更多關於here

+0

謝謝。 你的回答對我來說非常有幫助。 我不知道任何有關任務方法的信息。 這種方法不是我的課程主題。 –

相關問題