繁体   English   中英

NullPointerException,同时快速更新TextField

[英]NullPointerException while fast updating TextField

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

要做到这一点,我添加了一个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、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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM