Search
Write a publication
Pull to refresh

Проблема с производительностью в компоненте 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


То есть получается, что весь код выполняется достаточно быстро, примерно пол секунды, но после этого программа долго висит(порядка нескольких минут). Собственно хотелось бы спросить мнение знатоков, в чем тут проблема? Или возможно кто-нибудь подскажет, более эффективный способ создания компонента с подсветкой синтаксиса?
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.