2016-03-23 2 views
-2

У меня есть приложение, которое получает текст от пользователя, а затем помещает его в jLabel. Он выполняет некоторую обработку текста, поэтому я подумал, что это проблема, но после некоторого устранения неполадок я выделил наиболее трудоемкую часть программы.JLabel setText занимает слишком много времени

text1.setText(arg2); 

Где arg2 - длинная строка. В тестировании я использую 9000 строк. Он также отформатирован в HTML. Где бы я подумал, что это может занять некоторое время, на несколько секунд, это занимает огромное количество времени, 3 минуты и 35 секунд. Я нашел некоторые вопросы здесь, которые имеют аналогичные проблемы с JTextArea:

https://stackoverflow.com/questions/23951118/jtextarea-settextverylongstring-is-taking-too-much-time

Но я не могу найти способ применить это решение этой проблемы. Есть ли решение для этого?

EDIT - мой код ниже. Примечание. Я сократил среднюю часть строки для краткости.

import java.io.*; 
import java.lang.*; 
import javax.swing.*; 
public class jLabelIssue { 
    public static void main(String[] args) { 
     final JFrame frame = new JFrame("Comparinger use this to compare things and stuff"); 
     frame.setSize(268, 150); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     JLabel text1 = new JLabel(); 
     frame.add(text1); 
     arg2 = 
     "<HTML><font color=black>" + 
     "a<br/>" + 
     "a<br/>" + 
     "a<br/>" + 
     //... 9000 more lines of this ... 
     "a<br/>" + 
     "a<br/>" + 
     "a<br/>" + 
     "</font></HTML>"; 
     text1.setText(arg2); 
     frame.repaint(); 
    } 
} 
+6

За лучший шанс на приличном помощь, пожалуйста, создать и опубликовать достойную [mcve]. Пожалуйста, прочитайте эту важную ссылку, чтобы узнать подробности. –

+1

Также обратите внимание, что ссылка, предоставленная ** **, имеет пример того, что я имею в виду, также известный как [sscce] (http://sscce.org/). –

+4

'В тестировании я использую 9000 строк. Он также отформатирован в HTML' - JLabel не был предназначен для отображения 9000 строк текста. Какой смысл создавать чрезвычайно длинную строку сразу? Возможно, вы должны использовать что-то вроде JLIst для рендеринга одной строки за раз. Или, возможно, попробуйте использовать более подходящий компонент, предназначенный для HTML, например JEditorPane. – camickr

ответ

1

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

Поэтому не используйте HTML. Все время тратится на разбор HTML.

Просто используйте простой текст с атрибутами. Это использование JTextPane и цветового кода, который вы хотите.

Я сделал подсветку синтаксиса в исходном файле с исходным кодом в 9600 строк за пару секунд. И эта логика будет более сложной из-за синтаксического анализа текста в токенах.

Прочтите раздел из учебника Swing по Text Component Features для рабочего примера игры с атрибутами.

Ваша основная логика будет что-то вроде:

// Define the basic colors you want to use: 

SimpleAttributeSet colorCode1 = new SimpleAttributeSet(); 
StyleConstants.setForeground(keyWord, Color.RED); 

SimpleAttributeSet colorCode2 = new SimpleAttributeSet(); 
StyleConstants.setForeground(keyWord, Color.YELLOW); 

// Add some text 

JTextPane textPane = new JTextPane(); 
StyledDocument doc = textPane.getStyledDocument(); 

try 
{ 
    doc.insertString(doc.getLength(), "\nA line of text", colorCode1); 
    doc.insertString(doc.getLength(), "\nAnother line of text", colorCode2); 
} 
catch(Exception e) {} 
+0

Ну, я смог использовать это, но это не сэкономило время. JEditorPane заняла 9 минут, а JTextPane заняла 6 минут. Я закрываю это. – Goff

+0

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

Смежные вопросы