это мой первый вопрос на этом сайте, хотя я не первый раз вхожу, чтобы очистить мои сомнения, потрясающую веб-страницу. :)DocumentListener замедляет метод Document.setCharacterAttributes?
Я пишу программу java, которая выделяет код в JTextPane, и я меняю то, как делаются основные моменты. Я использую JTabbedPane, чтобы позволить пользователю редактировать несколько файлов одновременно, и я использовал для выделения документов с использованием таймера, теперь я создал выделенную очередь, которая работает в отдельном потоке, и реализовала DocumentListener, который ставит в очередь документы в виде изменений.
Но у меня действительно большая проблема, если я добавлю документ через DocumentListener, процесс выделения занимает очень много времени, а если я добавлю его в основной класс, получив документ непосредственно из JTextPane, он займет всего один несколько миллисекунд. Я выполнил несколько тестов в своем коде и выяснил, что то, что занимает столько времени, когда документ добавляется из DocumentListener, является методом Document.setCharacterAttributes().
Вот метод, который добавляет документы через DocumentListener:
// eventType: 0 - insertUpdate/1- removeUpdate
private void queueChange(javax.swing.event.DocumentEvent e, int eventType){
StyledDocument doc = (StyledDocument) e.getDocument();
int changeLength = e.getLength();
int changeOffset = e.getOffset();
int length = doc.getLength();
String title = (String) doc.getProperty("title");
String text;
try {
text = doc.getText(0, length);
if (changeLength != 1) {
Element element = doc.getDefaultRootElement();
int startLn = element.getElement(element.getElementIndex(changeOffset)).getStartOffset();
int endLn = element.getElement(element.getElementIndex(changeOffset + changeLength)).getEndOffset() - 1;
Engine.addDocument(doc, startLn, endLn, title, text);
} else {
if(eventType == 1){
changeOffset = changeOffset - changeLength;
}
int startLn = text.lastIndexOf("\n", changeOffset) + 1;
int endLn = text.indexOf("\n", changeOffset);
if (endLn < 0) {
if (length != startLn) {
endLn = length;
Engine.addDocument(doc, startLn, endLn, title, text);
}
} else if (startLn != endLn && startLn < endLn) {
Engine.addDocument(doc, startLn, endLn, title, text);
}
}
} catch (BadLocationException ex) {
Engine.crashEngine();
}
}
Если добавить документ с 2k линий с помощью этого метода, он занимает ~ 1900 мс, чтобы выделить весь документ, а если добавить документ в очередь выделения с помощью метода прослушивания каретки требуется ~ 500 мс.
Вот часть метода каретка прослушивания, который используется, чтобы выделить целые документы, когда они загружены:
if (loadFile == true) {
isKey = false;
doc = edit[currentTab].Editor.getStyledDocument();
try {
Highlight.addDocument(doc, 0, doc.getLength(),
Scripts.getTitleAt(currentTab), doc.getText(0, doc.getLength()));
} catch (BadLocationException ex) {
ex.printStackTrace();
}
loadFile = false;
}
Примечание: метод Выделите/Engine.addDocument() имеет пять параметров: (StyledDocument документ , int start, int end, String tabTitle, String docText). Начало и конец показывают регион, в котором требуется подсветка.
Буду признателен за любую помощь, связанную с этой проблемой, потому что я пытался ее решить в течение нескольких дней, и я не могу найти ничего подобного в Интернете. :(
Btw, кто-нибудь знает фактическую разницу между Document.setCharacterAttributes и Document.setParagraphAttributes: P
Спасибо за ваш ответ, но я проигнорировал метод changeUpdate, потому что у пользователя нет доступа к текстовым атрибутам, поэтому ничего не поделаешь, когда этот метод срабатывает. Основные моменты помещаются в очередь только при вставке insertUpdate или removeUpdate, а метод выделения, который я использую, выделяет текст, задавая атрибуты символа части документа, поэтому метод не вставляет больше текста. – escabuchen