2015-06-16 28 views
6

Risposta: JavaFX append text to TextArea throws ExceptionJavaFX Aggiungi testo ai TextArea getta Eccezione

Ho un filo che calcola la dimensione di una directory.

Io uso walkFileTree per questo.

Per ottenere alcune informazioni, aggiungo il file actuall a un'area di testo.

Ma quando ho un sacco di file (. Es> 300) Ho

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

Ecco il codice:

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

Quando creo un ArrayList e aggiungi ogni file ad esso e aggiungere questo ArrayList (ogni voce di fila) al TextArea, si sta lavorando.

Sembra un problema con la velocità del filo?

L'eccezione piena

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

Si ottiene quell'eccezione da quale linea? – immibis

+0

nel mio codice, ho aggiunto l'intera eccezione – Garog

+0

@ user3710098 Se taStatus è un elemento ui, puoi provare ad aggiungere 'Platform.runLater (() -> taStatus.appendText());' – varren

risposta

7

imbattuto in stesso errore e, come il commento di Kleopatra ha dichiarato, textarea FX devono essere accessibili su filo FX.

Per i casi semplici, usare Platform.runLater con Java 8 Lambda:

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

Se si dispone di molti messaggi di log, invece di allagare la FX filo sarebbe meglio per tamponare loro e aggiornamento TextArea meno frequentemente. Ecco un esempio: https://stackoverflow.com/a/31414801/3710098

+1

che funziona se non aggiungi molto, dai un'occhiata qui, spiega perché runLater non è la scelta migliore http://stackoverflow.com/a/31414801/3710098 – Garog

+0

@Garog Hai fatto bene la tua ricerca:) Memorizzo anche i miei messaggi ma preferisco una risposta semplice. Questa è buona; Ho collegato ad esso. – Sheepy