Как стать автором
Обновить

Проблема с производительностью в компоненте JTextPane

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

package ru.seogenerator.testhighlightedtextpane 

import java.awt.Color;
import java.awt.EventQueue;
import java.sql.Date;
import java.text.SimpleDateFormat;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class HighlightedTextPane extends JTextPane {

	public static void main(String[] args) {
		log("Старт программы");
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
				    JFrame frame = new JFrame();
				    HighlightedTextPane htp = new HighlightedTextPane();
                                    JScrollPane srp = new JScrollPane(htp);
				    frame.setContentPane(srp);
				    frame.setSize(300, 400);
                                    frame.setVisible(true); 	
				} catch (Exception e) {	
					e.printStackTrace();	
				}
			}
		});  
	}

	public HighlightedTextPane(){
		final int ITERATION_COUNT = 20000;
		// Заполняем тестовыми данными
		StringBuilder sb = new StringBuilder();
		for (int i = 1; i < ITERATION_COUNT; i++){
			sb.append('a');
			sb.append('{');
		}
		this.setText(sb.toString());
		// Подсвечиваем текст
		long startTime = System.currentTimeMillis();
		log("Перед вызовом метода highLightText()");
		highLightText();
		log("После вызова метода highLightText(), время выполнения = "
                         + String.valueOf(System.currentTimeMillis()-startTime) + " ms" );
	}
	
	private void highLightText() {

                SimpleAttributeSet sattrRed = new SimpleAttributeSet();                 
                StyleConstants.setForeground(sattrRed, Color.red);
                StyleConstants.setBold(sattrRed, true

                SimpleAttributeSet sattrBlack = new SimpleAttributeSet();                 
                StyleConstants.setForeground(sattrBlack, Color.black);
                StyleConstants.setBold(sattrBlack, false);

                StyledDocument doc = this.getStyledDocument()
                int startOffset = doc.getStartPosition().getOffset();
                int endOffset = startOffset + doc.getLength();
        
                for (int i = startOffset; i <= endOffset; i++  ){
        	      char currСhar = '(';
                      try {        	
            	           currСhar = doc.getText(i,1).charAt(0);           
                      } 
                      catch (BadLocationException e) {
            	           e.printStackTrace();
                     }
                     if (currСhar == '{' ) {      
            	          doc.setCharacterAttributes(i, 1, sattrRed, true); 
                     }
                     else {
                          doc.setCharacterAttributes(i, 1, sattrBlack, true);
                    }        
              }   
	}
		

public static void log(String msg){
	SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss.SSS");
	System.out.println(format.format(new Date(System.currentTimeMillis())) + "  > " + msg );	
}
}




На моем компьютере программа выводит в консоль следующее:

07:39:01.469 > Старт программы
07:39:03.059 > Перед вызовом метода highLightText()
07:39:03.552 > После вызова метода highLightText(), время выполнения = 493 ms


То есть получается, что весь код выполняется достаточно быстро, примерно пол секунды, но после этого программа долго висит(порядка нескольких минут). Собственно хотелось бы спросить мнение знатоков, в чем тут проблема? Или возможно кто-нибудь подскажет, более эффективный способ создания компонента с подсветкой синтаксиса?
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.