これはこのサイトの最初の質問ですが、私の疑問を解決するために初めて入力したのではありません。すばらしいウェブページです。 :)DocumentListenerはDocument.setCharacterAttributesメソッドの速度を落としますか?
JTextPaneのコードをハイライトするJavaプログラムを作成していますが、ハイライトの処理方法を変更しています。私はJTabbedPaneを使用してユーザーが複数のファイルを同時に編集できるようにしていて、Timerを使用してドキュメントハイライトを実行していましたが、別のスレッドで実行されるハイライトキューを作成し、変更が発生したときに文書が表示されます。
しかし、私は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ミリ秒かかりますキャレットリスニング方法を使用してハイライトキューに約500msかかる。
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()メソッドは、5つのパラメータがあります(StyledDocumentのドキュメント、int start、int end、String tabTitle、String docText)を返します。開始と終了の両方は、強調表示が必要な領域を示します。私は数日間それを解決しようとしていたので、私はインターネット上で同様の何かを見つけることができないため、この問題に関連する助けを感謝します。 :(
ところで、誰でもDocument.setCharacterAttributesとDocument.setParagraphAttributes間の実際の違いを知っているん:?P
返信いただきありがとうございますが、ユーザーがテキスト属性にアクセスすることができないためchangedUpdateメソッドを無視しました。そのため、メソッドが起動すると何も実行されません。 ハイライトは、insertUpdateまたはremoveUpdateが呼び出されたときにのみキューに入れられます。ハイライト方法は、ドキュメントの一部の文字属性を設定することによってテキストを強調表示します。 – escabuchen