2014-12-09 4 views
0

У меня есть массив String с приблизительно 10000 элементами текста, которые я хочу поместить в JTextPane. К сожалению, это слишком медленно, и у меня нет никаких идей о том, как повысить производительность. В частности, это занимает очень много времени, когда я использую китайские или арабские буквы/шрифты.Улучшение производительности JTextPane

Требуется ~ 20 секунд, чтобы загрузить каждый арабский текст из массива строк в текстовое поле на i5 @ 2Ghz.

Вот мой код:

import java.awt.BorderLayout; 
import javax.swing.*; 
import javax.swing.text.*; 

public class JTextPaneTest { 
    private JTextPane textPane = new JTextPane(); 
    Document doc = new DefaultStyledDocument(); 
    private JPanel panel = new JPanel(); 

    //constructor 
    JTextPaneTest() {    
     for(int i=0;i<10000;i++) { 
      try { 
       doc.insertString(doc.getLength(), i+" hello world!\n", null); 
      } catch (BadLocationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }    
     } 
     textPane.setDocument(doc); 
     createWindow(); 
    } 

    public void createWindow() { 
     JFrame frame = new JFrame(); 
     frame = new JFrame("frame");  
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 300); 
     frame.setLocationRelativeTo(null); 
     frame.getContentPane().add(new JScrollPane(textPane), BorderLayout.CENTER); 
     frame.setVisible(true);   
    } 

    public static void main(String[] args) { 
     System.out.println("start..."); 
     float startTime = System.nanoTime(); 
     new JTextPaneTest(); 
     float stopTime = System.nanoTime() - startTime; 
     System.out.println("elapsed time main: "+stopTime/1000000000+ "s"); 
    } 
} 

В приведенном выше примере, я использовал "Привет, мир!" вместо строкового массива, чтобы сделать код более четким.

Как можно улучшить алгоритм? Любые альтернативные идеи?

Thanks

+0

порядок, в котором содержание добавляется в TextPane Имеет ли значение? Если нет, вы можете рассмотреть многопоточный подход, если это возможно. –

+1

@ Крис: да, порядок должен быть восходящим. – Ramses

ответ

1

Проблема может быть длинной LabelViews измерения.

Предположим, что текст имеет 10000 символов, он измеряется в соответствии с доступной шириной, а часть метки создана (допустим, 100 символов). Затем 9900 символов снова измеряется и т. Д., Чтобы создать 100 из 100 символов.

Вы можете создать искусственный перерыв, чтобы избежать такого большого измерения текста.

Смотрите здесь http://java-sl.com/JEditorPanePerformance.html