- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我在这个网站上的第一个问题,虽然不是我第一次进入这个网站来消除我的疑虑,很棒的网页。 :)
我正在编写一个 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/
我有一个实现 DocumentListener 的类: public class MyListener implements DocumentListener{ pri
我像这样创建 DocumentListeners: MyDocumentListener dl = new MyDocumentListener(); tab.getDocument().addDoc
您好,我的文档监听器有问题。将值插入文本字段后,程序停止工作。该程序应将第一行文本字段与第二行文本字段进行异或,并将结果放入第三行文本字段 package opa.beta1; import java
我正在开发一个小型 GUI 应用程序,我应该在其中打开 JTextPane 中的文本文档。它工作正常,除了当我将 DocumentListener 添加到我的 JTextPane 时,没有调用监听器。
我认为这很容易,因为我显然不理解 DocumentListeners。我创建了一个 JFormattedTextField 扩展来包含一个监听器,以便我可以使用更改后的字段文本更新 HashMap 。
我有两个文本区域。当我在第一个文本区域中输入内容时,它会通过文档监听器显示在第二个文本区域中。我想使用替换来用不同的单词替换某些单词(就像翻译器一样)。 我的 DocumentListener 看起来
我想做的是阻止用户在我的输入中输入空字符串。目前,用户只能输入数字。然而,没有什么可以阻止他们将文本字段留空。我想限制他们在空白时按下我的按钮来启动程序。 现在,我的文本字段最初留空,按钮最初呈灰色。
编辑:您认为可能重复的问题的解决方案( java.lang.IllegalStateException while using Document Listener in TextArea, Java
我有一个 JTabbedPane。我根据具有 JTextPane 信息的类(此处称为 textWrap)的实例化添加选项卡。我创建一个新的监听器实例并将其传递到 textWrap 的实例化中: tab
我在 JFrame 中垂直显示 2 个列表。假设列表 A 是 ArrayList列表 B 是 ArrayList . 我想“更新”列表 B 中与列表 A 中元素的相同索引与 CustomTextFie
我有一个文档监听器,它是间接源,JTextArea(JTextArea.getDocument().addDocumentListener 等..)。 我需要我的监听器能够访问 JTextArea,但
来自 text components 上的 Swing 教程: You may want to change the document's text within a document listene
我有一个类 TestListeners,其中包含一些 JTextFields 和其他属性(此处为整数)。我希望属性在相应的 JTextField 文本更改时更新。因此,我添加了一些 DocumentL
在this question的评论中提到了并在 this question 的答案中应该使用 documentListener 或 documentFilter 而不是 keyListener。这是为
目前我在每个文本字段上使用 DocumentListener 来实时验证用户输入,但我认为必须有更聪明的方法,因为我重复了这么多。 有没有更聪明的方法? nameJTextField.getDocum
我正在制作一个 Swing MVC 应用程序,以了解使用 Swing 框架进行 GUI 设计的复杂性。我的 JDK 版本是 7,我有一个简单的应用程序,其中包含一个对话框,其中有一个用于存储文件路径的
我正在尝试使用 DocumentListener 实现创建一个单独的类来检查天气 TextFields 是否为空,以便可以将其添加到多个 JTextFeilds 中。我已经创建了 DocumentLi
我有 JTextArea,需要获取添加、删除或更改的字符。我该怎么做? 最佳答案 添加很简单,您只需使用一个 DocumentListener。 要处理添加和删除,您可以使用 DocumentFilt
JTextArea area1 = new JTextArea(); JTextArea area2 = new JTextArea(); DocumentListener documentListe
下面给出的代码对一个 JTextField 进行实时验证。在 txt1 中输入一些值时会启用保存按钮,而删除值会将保存按钮重置为禁用。我使用 Netbeans 作为 IDE。 我的 Swing 应用程
我是一名优秀的程序员,十分优秀!