JavaFX将文本追加到TextArea引发异常
答复: 我有一个计算目录大小的线程 我使用walkFileTree进行此操作 为了获得一些信息,我将actuall文件附加到一个textarea 但是当我有很多文件(例如>300个)时 线程“JavaFX应用程序线程”java.lang.ArrayIndexOutOfBoundsException中的异常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
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你的研究做得很好:)我也会缓存我的消息,但我更喜欢一个简单的答案。这是个好主意;我已链接到它。