2015-06-16 16 views
6

Trả lời: JavaFX append text to TextArea throws ExceptionJavaFX nối văn bản vào TextArea ném Ngoại lệ

Tôi có một chuỗi tính toán kích thước của một thư mục.

Tôi sử dụng walkFileTree cho việc này.

Để nhận một số thông tin, tôi nối tệp actuall vào vùng văn bản.

Nhưng khi tôi có rất nhiều các tập tin (. Ex> 300) Tôi đã nhận

Exception in thread "JavaFX Application Chủ đề" java.lang.ArrayIndexOutOfBoundsException

Đây là mã:

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

Khi tôi tạo một ArrayList và thêm từng tệp vào và thêm ArrayList này (mỗi mục nhập liên tiếp) vào TextArea, nó đang hoạt động.

Dường như vấn đề với tốc độ chỉ?

Các ngoại lệ đầy đủ

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

Bạn nhận ngoại lệ đó từ dòng nào? – immibis

+0

không nơi nào trong mã của tôi, tôi đã thêm toàn bộ Ngoại lệ – Garog

+0

@ user3710098 Nếu taStatus là một phần tử ui, bạn có thể thử thêm 'Platform.runLater (() -> taStatus.appendText());' – varren

Trả lời

7

Ran vào cùng một lỗi và như bình luận Kleopatra của tuyên bố, textarea FX phải được truy cập vào chủ đề FX.

Đối với trường hợp đơn giản, sử dụng Platform.runLater với Java 8 Lambda:

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

Nếu bạn có nhiều thông điệp nhật ký, thay vì ngập FX thread nó sẽ tốt hơn để đệm cho họ và cập nhật TextArea ít thường xuyên. Dưới đây là ví dụ: https://stackoverflow.com/a/31414801/3710098

+1

hoạt động nếu bạn không thêm nhiều, hãy xem tại đây, nó giải thích tại sao runLater không phải là lựa chọn tốt nhất http://stackoverflow.com/a/31414801/3710098 – Garog

+0

@Garog Bạn đã nghiên cứu tốt:) Tôi cũng lưu trữ các thông điệp của mình nhưng tôi thích một câu trả lời đơn giản hơn. Đó là một thứ tốt; Tôi đã liên kết với nó. – Sheepy

Các vấn đề liên quan