gpt4 book ai didi

java - 快速更新 TextField 时出现 NullPointerException

转载 作者:行者123 更新时间:2023-12-02 03:10:25 25 4
gpt4 key购买 nike

我正在开发一个应用程序,它在定向文件夹中搜索一些文件并将它们打印在 TableView<myFile> foundFilesList 中,它存储在 Main 类中。 myFile只是延伸File一点点。搜索是使用后台线程中的服务完成的,它将找到的数据放入 ObservableList<myFile> filesOfUser 。我想显示 TextField foundFilesAmount 中当前查找文件的数量在同一 View 中,带有文件的 TableView 所在的位置 -- ResultsView

为此,我添加了 ListChangeListener对于 foundFilesListResultsView Controller ,使用方法 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 应用程序线程。其内容:

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 次更新等之后。但如果搜索时间更长,仍然会抛出异常。

是否有正确的方法来显示当前找到的文件数量,包含实际数量并且不会导致太多异常?

提前致谢。

最佳答案

正确的方法是不在应用程序线程以外的线程上进行 UI 更新。否则,这可能会导致渲染/布局问题。

您可以使用任务来对更新进行更新:

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();

关于java - 快速更新 TextField 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41141559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com