[英]NullPointerException while fast updating TextField
我正在开发一个应用程序,该应用程序在有向文件夹中搜索一些文件,并在TableView<myFile> foundFilesList
打印它们,该文件存储在Main类中。 myFile
只是扩展了File
。 搜索是使用后台线程中的服务完成的,该服务将找到的数据放入ObservableList<myFile> filesOfUser
。 我想在具有文件的TableView所在的同一视图中的TextField foundFilesAmount
中显示当前查找文件的数量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));
现在的问题是什么。 具有当前查找文件数量的文本字段更新非常快,从一开始它就停止了更新。 在控制台中,我从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、15更新之后才更新foundFilesAmount
值,等等。但是,如果搜索工作时间更长,仍然会抛出异常。
是否有一种正确的方法来显示当前找到的文件数量,其中包含实际数量并且不会引起太多异常?
提前致谢。
正确的方法是不对应用程序线程以外的线程进行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();
尝试这样的事情:
Platform.runLater(new Runnable() {
@Override
public void run() {
// update your JavaFX controls here
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.