快速更新TextField

时间:2016-12-14 11:34:06

标签: java events javafx observablelist

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

为此,我为ListChangeListener foundFilesList添加了ResultsViewsetText控制器,使用方法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]中的值等。但如果搜索工作时间更长,仍然会抛出异常。

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

提前致谢。

2 个答案:

答案 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
        }
    });