JavaFX将文本附加到TextArea会抛出exception

答案: JavaFX将文本附加到TextArea会抛出exception

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

我使用walkFileTree。

要获取一些信息,我将actuall文件附加到textarea。

但是当我有很多文件(例如> 300)时,我得到了

线程“JavaFX Application Thread”中的exceptionjava.lang.ArrayIndexOutOfBoundsException

这是代码:

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() { @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(); } 

当我创建一个ArrayList并将每个文件添加到它并将此ArrayList(一行中的每个条目)附加到TextArea时,它正在工作。

它看起来像线程速度的问题?

完整的例外

 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) 

与kleopatra的评论相同,FX textarea必须在FX线程上访问。

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

 javafx.application.Platform.runLater( () -> taStatus.appendText(file.toString() + "\n") ); 

如果您有许多日志消息,而不是充斥FX线程,最好缓冲它们并更少地更新TextArea。 这是一个例子: https : //stackoverflow.com/a/31414801/3710098