2015-06-10 23 views
1

我正在更新javafx.scene.control的字符串內容。 TextArea來自不同的線程,當時添加一個句子。JavaFX TextArea。當使用appendText太快時,應用程序崩潰。任何建議?

這是從那裏我追加到文本區我的監聽器方法(命名爲顯示):

public void onStatus(Status status) { 
     if(userFilters.statusMatches(status)){ 
      display.appendText("@" 
       + status.getUser().getScreenName() + "\n" 
       + status.getText() + "\n-------------\n"); 
     } 
} 

如果張貼的速度不是過快,它的工作原理。

否則,如果傳入的消息太多(例如從社交網絡獲取的公共帖子),應用程序的「圖形更新」會在其中幾個之後崩潰。

異常並不涉及我寫的代碼的任何元素。所以我不知道如何捕捉它們並以一種乾淨的方式停止應用程序。

(順便說一句,我不是想追加一個null元素。)

這些是例外:

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:314) 
at com.sun.javafx.tk.Toolkit$$Lambda$122/1010826311.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$41/1654631781.run(Unknown Source) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 

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$MiscProperties$2.computeBounds(Node.java:6451) 
at javafx.scene.Node$LazyBoundsProperty.get(Node.java:9285) 
at javafx.scene.Node$LazyBoundsProperty.get(Node.java:9255) 
at javafx.scene.Node.getBoundsInLocal(Node.java:3135) 
at com.sun.javafx.scene.control.skin.TextAreaSkin$ContentView.layoutChildren(TextAreaSkin.java:207) 
at javafx.scene.Parent.layout(Parent.java:1076) 
at javafx.scene.Parent.layout(Parent.java:1082) 
at javafx.scene.Parent.layout(Parent.java:1082) 
at javafx.scene.Parent.layout(Parent.java:1082) 
at javafx.scene.Parent.layout(Parent.java:1082) 
at javafx.scene.Parent.layout(Parent.java:1082) 
at javafx.scene.Parent.layout(Parent.java:1082) 
at javafx.scene.Scene.doLayoutPass(Scene.java:552) 
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2397) 
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:314) 
at com.sun.javafx.tk.Toolkit$$Lambda$122/1010826311.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$41/1654631781.run(Unknown Source) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
at com.sun.javafx.text.PrismTextLayout.layout(PrismTextLayout.java:1063) 
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.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$122/1010826311.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$41/1654631781.run(Unknown Source) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 

Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException 
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException 
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException 
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException 
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException 

(...等等...)

+2

你能告訴我們相關的代碼部分,其他線程正在更新gui嗎? –

+0

如果TextArea對於GUI不是強制性的,請嘗試標籤或文本。 –

回答

2

由於變量linesPrismTextLayout內爲空,所以拋出兩個異常。爲什麼這是null?它被設置爲null每次追加文本到文本區在這個方法(這是由append調用)時間:

com.sun.javafx.text.PrismTextLayout.reset(PrismTextLayout.java:92) 

lines VAR不是null正常,因爲每個場景渲染它時間重置。您正在獲得此NPE,因爲您正在撥打的lines之間的呼叫設置爲空,並被重置爲其正常值。

解決方案是從JavaFX應用程序線程調用append(即使用runLater(() -> ...)來附加到TA)。

+0

appendText方法已經在使用Platform.runLater方法啓動的線程中。 –

+0

但這仍然是一個新線程,而不是JavaFX應用程序線程。 –

相關問題