Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX将文本追加到TextArea引发异常_Java_Multithreading_Textarea_Javafx 8 - Fatal编程技术网

JavaFX将文本追加到TextArea引发异常

JavaFX将文本追加到TextArea引发异常,java,multithreading,textarea,javafx-8,Java,Multithreading,Textarea,Javafx 8,答复: 我有一个计算目录大小的线程 我使用walkFileTree进行此操作 为了获得一些信息,我将actuall文件附加到一个textarea 但是当我有很多文件(例如>300个)时 线程“JavaFX应用程序线程”java.lang.ArrayIndexOutOfBoundsException中的异常 Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at com.sun.ja

答复:

我有一个计算目录大小的线程

我使用walkFileTree进行此操作

为了获得一些信息,我将actuall文件附加到一个textarea

但是当我有很多文件(例如>300个)时

线程“JavaFX应用程序线程”java.lang.ArrayIndexOutOfBoundsException中的异常

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at com.sun.javafx.text.PrismTextLayout.addTextRun(PrismTextLayout.java:755)
    at com.sun.javafx.text.GlyphLayout.addTextRun(GlyphLayout.java:121)
    at com.sun.javafx.text.GlyphLayout.breakRuns(GlyphLayout.java:191)
    at com.sun.javafx.text.PrismTextLayout.buildRuns(PrismTextLayout.java:770)
    at com.sun.javafx.text.PrismTextLayout.layout(PrismTextLayout.java:1021)
    at com.sun.javafx.text.PrismTextLayout.ensureLayout(PrismTextLayout.java:223)
    at com.sun.javafx.text.PrismTextLayout.getBounds(PrismTextLayout.java:246)
    at javafx.scene.text.Text.getLogicalBounds(Text.java:358)
    at javafx.scene.text.Text.impl_computeGeomBounds(Text.java:1168)
    at javafx.scene.Node.updateGeomBounds(Node.java:3556)
    at javafx.scene.Node.getGeomBounds(Node.java:3509)
    at javafx.scene.Node.getLocalBounds(Node.java:3457)
    at javafx.scene.Node.updateTxBounds(Node.java:3620)
    at javafx.scene.Node.getTransformedBounds(Node.java:3403)
    at javafx.scene.Node.updateBounds(Node.java:538)
    at javafx.scene.Parent.updateBounds(Parent.java:1706)
    at javafx.scene.Parent.updateBounds(Parent.java:1706)
    at javafx.scene.Parent.updateBounds(Parent.java:1706)
    at javafx.scene.Parent.updateBounds(Parent.java:1706)
    at javafx.scene.Parent.updateBounds(Parent.java:1706)
    at javafx.scene.Parent.updateBounds(Parent.java:1706)
    at javafx.scene.Parent.updateBounds(Parent.java:1706)
    at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2404)
    at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:314)
    at com.sun.javafx.tk.Toolkit$$Lambda$178/156290868.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:313)
    at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:340)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:525)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:505)
    at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$400(QuantumToolkit.java:334)
    at com.sun.javafx.tk.quantum.QuantumToolkit$$Lambda$47/104706045.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139)
    at com.sun.glass.ui.gtk.GtkApplication$$Lambda$43/1086508417.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
代码如下:

private void startScheduledExecutorService() {

        Thread dt = new Thread(new Runnable() {
            public void run() {
                try {
                    taStatus.appendText("Dateien werden ermittelt\n");
                    Files.walkFileTree(quellOrdner.toPath(), new SimpleFileVisitor<Path>() {
                        @Override
                        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                            size += attrs.size();
                            files++;
                            taStatus.appendText(file.toString() + "\n");
                            return FileVisitResult.CONTINUE;
                        }

                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }, "dt");
        dt.setDaemon(true);
        dt.start();
    }

遇到了相同的错误,正如kleopatra的评论所述,必须在FX线程上访问FX textarea

对于简单的情况,请与Java 8 Lambda一起使用:

javafx.application.Platform.runLater(()->taStatus.appendText(file.toString()+“\n”);
如果您有许多日志消息,与其淹没FX线程,不如缓冲它们,并减少更新TextArea的频率。
下面是一个示例:

您从哪一行获得该异常?在我的代码中没有任何地方,我添加了完整的Exception@user3710098如果taStatus是某个ui元素,则可以尝试添加
Platform.runLater(()->taStatus.appendText())taStatus是一个JavaFX文本区域。我将根据您的建议尝试一下。严格来说,ui元素必须在fxApplication线程上访问。您的代码片段违反了该规则-实际行为尚未确定,严重错误是肯定的:-)要将结果从后台线程(如您收集文件,fi.)传递到fx线程,请查看fx并发程序包。如果您没有添加太多,请查看此处,这解释了为什么runLater不是最佳选择@Garog你的研究做得很好:)我也会缓存我的消息,但我更喜欢一个简单的答案。这是个好主意;我已链接到它。