gpt4 book ai didi

java - DocumentListener 会减慢 Document.setCharacterAttributes 方法的速度吗?

转载 作者:行者123 更新时间:2023-12-01 05:51:18 25 4
gpt4 key购买 nike

这是我在这个网站上的第一个问题,虽然不是我第一次进入这个网站来消除我的疑虑,很棒的网页。 :)

我正在编写一个 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;
}

注意:Highlight/Engine.addDocument() 方法有五个参数:(StyledDocument doc,int start, int end, String tabTitle, String docText)。开始和结束都表示需要突出显示的区域。

我将不胜感激与此问题相关的任何帮助,因为我已经尝试解决该问题几天了,但在互联网上找不到类似的内容。 :(

顺便说一句,有谁知道 Document.setCharacterAttributes 和 Document.setParagraphAttributes 之间的实际区别吗? :P

最佳答案

也许您的代码中有某种递归导致了问题。使用 DocumentEvent,您只需担心添加和删除。您无需担心更改,因为这些是属性更改。

也许您添加了一些安排突出显示的文本,但是当您更改文本的属性时,您安排了另一个突出显示任务。

关于java - DocumentListener 会减慢 Document.setCharacterAttributes 方法的速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4600672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com