我正在开发一个应用程序,它会搜索定向文件夹中的某些文件并将其打印在TableView<myFile> foundFilesList
中,并存储在Main类中。 myFile
只是稍微扩展File
。搜索是使用后台线程中的服务完成的,该服务将找到的数据放入ObservableList<myFile> filesOfUser
。
我想在TextField foundFilesAmount
的同一视图中显示查找文件的当前数量,其中带有文件的TableView位于 - ResultsView
为此,我为ListChangeListener
foundFilesList
添加了ResultsView
个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));
仅包含
NullPointerException's
现在问题是什么。具有当前查找文件数量的文本字段更新非常快,并且从一瞬间停止执行。在控制台中,我看到JavaFX Application Thread中有很多重复的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
我尝试在使用foundFilesAmount
之前设置延迟类型,例如仅在第5次,第10次,第15次更新后更新log4net: Opening file for writing [C:\myLogPath\] append [True]
中的值等。但如果搜索工作时间更长,仍然会抛出异常。
是否有正确的方法来显示当前已找到的文件数量,其中包含实际金额并且不会导致如此多的异常?
提前致谢。
答案 0 :(得分: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();
答案 1 :(得分:0)
尝试这样的事情:
Platform.runLater(new Runnable() {
@Override
public void run() {
// update your JavaFX controls here
}
});