2016-12-14 70 views
0

我正在研究一個應用程序,該應用程序搜索定向文件夾中的某些文件並將其打印在存儲在Main類中的TableView<myFile> foundFilesList中。 myFile只是延伸File一點點。搜索使用後臺線程中的服務完成,它將找到的數據存儲到ObservableList<myFile> filesOfUser。 我想在同樣的觀點,其中的TableView與文件位於顯示的查找文件的電流量TextField foundFilesAmount - ResultsView快速更新TextField時發生NullPointerException

爲了做到這一點,我添加了一個ListChangeListenerfoundFilesListResultsView控制器,使用方法setText打印目前尺寸爲filesOfUser。它看起來像:

Main.filesOfUser.addListener(new ListChangeListener<myFile>() { 
     @Override 
     public void onChanged(Change<? extends myFile> c) { 
       while (c.next()){ 
        if (c.wasAdded()) 
         setCounter(c.getAddedSize());  
       } 
     } 
}); 

void setCounter (int number)只包含

int currValue = Integer.valueOf(foundFilesAmount.getText()); 
    foundFilesAmount.setText(String.valueOf(currValue + number)); 

而現在的問題是什麼。包含當前數量查找文件的文本字段更新速度非常快,從一刻起停止執行。在控制檯中,我看到很多來自JavaFX Application Thread的重複的NullPointerException's。它的內容:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException 
at com.sun.javafx.text.PrismTextLayout.getRuns(PrismTextLayout.java:236) 
at javafx.scene.text.Text.getRuns(Text.java:317) 
at javafx.scene.text.Text.updatePGText(Text.java:1465) 
at javafx.scene.text.Text.impl_updatePeer(Text.java:1500) 
at javafx.scene.Node.impl_syncPeer(Node.java:503) 
at javafx.scene.Scene$ScenePulseListener.synchronizeSceneNodes(Scene.java:2290) 
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2419) 
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354) 
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381) 
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510) 
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490) 
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
at java.lang.Thread.run(Thread.java:745) 

我試着用setText,只喜歡第5',10'th,15'th更新等之後,但如果搜索工作不再foundFilesAmount更新值之前設置的排序延時,異常仍然被拋出。

是否有正確的方法來顯示當前發現文件的數量,其中包含實際的金額,並沒有造成太多的例外?

在此先感謝。

回答

2

正確的方法是不在應用程序線程以外的線程上執行UI的更新。否則這可能會導致渲染/佈局問題。

你可以使用一個Task做更新,但更新:

Task<ObservableList<myFile>> task = new Task< 
Task<ObservableList<myFile>>() { 
    @Override 
    protected ObservableList<myFile> call() throws Exception { 
     ObservableList<myFile> files = FXCollections.observableArrayList(); 

     while (...) { 
      ... 
      files.add(...); 
      updateMessage(Integer.toString(files.size())); 
      ... 
     } 

     return files; 
    } 
}; 
task.setOnSucceeded(evt -> tableView.setItems(task.getValue())); 
Thread t = new Thread(task); 
textField.textProperty().bind(task.messageProperty()); 
t.setDaemon(true); 

t.start(); 
+0

搜索本身是由'SimpleFileVisitor'在單獨的類來完成。從任務我只能通過'Files.walkFileTree'開始搜索。如果我嘗試使用來自控制器的方法,那更新我的textField,在這個單獨的類中,我得到'NullPointerException',導致textField不在其他線程中inizialised。這就是我在那裏使用'ListChangeListener'的原因。 – Lexx129

0

嘗試這樣的事:

Platform.runLater(new Runnable() { 
     @Override 
     public void run() { 
      // update your JavaFX controls here 
     } 
    });