2015-06-16 10 views
6

उत्तर फेंकता के लिए: JavaFX append text to TextArea throws ExceptionJavaFX पाठ संलग्न TextArea अपवाद

मैं एक धागा है कि एक निर्देशिका के आकार की गणना करता है।

मैं इसके लिए walkFileTree का उपयोग करता हूं।

कुछ जानकारी प्राप्त करने के लिए, मैं actuall फ़ाइल को textarea में जोड़ता हूं।

लेकिन जब मैं फ़ाइलों का एक बहुत (उदा।> 300) मुझे मिल गया सूत्र में "JavaFX आवेदन थ्रेड"

अपवाद java.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<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(); 
    } 

जब मैं एक ArrayList बना सकते हैं और TextArea को यह ArrayList (एक पंक्ति में प्रत्येक प्रविष्टि) यह करने के लिए प्रत्येक फ़ाइल जोड़ सकते हैं और संलग्न है, यह काम कर रहा है।

यह थ्रेड की गति के साथ एक समस्या की तरह दिखता है?

पूर्ण अपवाद

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) 
+0

आपको उस लाइन से वह अपवाद मिलता है? – immibis

+0

मेरे कोड में कहीं भी नहीं, मैंने पूर्ण अपवाद – Garog

+0

@ user3710098 जोड़ा है यदि taStatus कुछ UI तत्व है, तो आप 'Platform.runLater (() -> taStatus.appendText()) जोड़ने की कोशिश कर सकते हैं;' – varren

उत्तर

7

एक ही त्रुटि का सामना किया और के रूप में Kleopatra की टिप्पणी में कहा गया है, FX पाठ क्षेत्र FX धागे पर पहुंच की जानी चाहिए। बजाय FX थ्रेड यह उन्हें और अद्यतन TextArea कम बार बफ़र होना बेहतर होगा बाढ़ की

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

आप कई लॉग संदेशों है, तो:

सरल मामलों के लिए, जावा 8 लैम्ब्डा साथ Platform.runLater का उपयोग करें। यहां एक उदाहरण है: https://stackoverflow.com/a/31414801/3710098

+1

जो काम करता है यदि आप बहुत कुछ नहीं जोड़ते हैं, तो यहां देखें, यह बताता है कि रनरेटर सबसे अच्छा विकल्प क्यों नहीं है http://stackoverflow.com/a/31414801/3710098 – Garog

+0

@Garog आपने अपना शोध अच्छी तरह से किया है:) मैं अपने संदेशों को भी कैश करता हूं लेकिन मुझे एक साधारण जवाब पसंद है। वह वाला अच्छा है; मैंने उससे जुड़ा हुआ है। – Sheepy