Столкнулся с проблемой, при разработке текстового поля с подсветкой несложного синтаксиса. После применения атрибутов к большому тексту, компонент зависает на большой промежуток времени. Приведу пример модуля, который можно запустить и все увидеть своими глазами…
На моем компьютере программа выводит в консоль следующее:
07:39:01.469 > Старт программы
07:39:03.059 > Перед вызовом метода highLightText()
07:39:03.552 > После вызова метода highLightText(), время выполнения = 493 ms
То есть получается, что весь код выполняется достаточно быстро, примерно пол секунды, но после этого программа долго висит(порядка нескольких минут). Собственно хотелось бы спросить мнение знатоков, в чем тут проблема? Или возможно кто-нибудь подскажет, более эффективный способ создания компонента с подсветкой синтаксиса?
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
То есть получается, что весь код выполняется достаточно быстро, примерно пол секунды, но после этого программа долго висит(порядка нескольких минут). Собственно хотелось бы спросить мнение знатоков, в чем тут проблема? Или возможно кто-нибудь подскажет, более эффективный способ создания компонента с подсветкой синтаксиса?