我在JTextPane中显示一些文本,并使用DefaultStyledDocument的实现突出显示一些语法。这有效。 现在我想添加一个搜索(ctrl-F)功能,并尝试使用swingx中的JXEditorPane而不是JTextPane。 我正在做:
p = new JXEditorPane();
p.setEditable(false);
p.setDocument(new MyStyledDocument());
p.getDocument().addDocumentListener( ... some callbacks ... );
我的回调按预期调用。但是,文本似乎没有样式。这可行吗? (我注意到只有JTextPane中的文档讨论了StyledDocument,来自JTextComponent的setDocument()只讨论了Document)。
[编辑]我将代码缩减为(对不起,我能做的最好):
MyStyledDocument.java:
package com.mydemo;
import java.awt.*;
import javax.swing.text.*;
public class MyStyledDocument extends DefaultStyledDocument {
private Style _style;
public MyStyledDocument() {
_style = addStyle("bluuuue", null);
StyleConstants.setBold(_style, true);
StyleConstants.setForeground(_style, new Color(0, 250, 255));
}
public synchronized void applyStyle() {
System.out.println("applyStyle");
setCharacterAttributes(0, getLength(), _style, true);
}
}
Gui.java:
package com.mydemo;
import org.jdesktop.swingx.JXEditorPane;
import javax.swing.*;
import javax.swing.event.*;
public class Gui extends JFrame {
private static final long serialVersionUID = 1L;
public Gui() {
super();
setSize(100, 100);
JEditorPane pane = new JTextPane(); // replace by new JXEditorPane() here
pane.setEditable(false);
pane.setDocument(new MyStyledDocument());
pane.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) { applyStyleInNextTick(e); }
public void removeUpdate(DocumentEvent e) { applyStyleInNextTick(e); }
public void changedUpdate(DocumentEvent e) { /* Do NOT restyle here, as this gets triggered by styling */ }
private void applyStyleInNextTick(final DocumentEvent e) {
SwingUtilities.invokeLater(new Runnable() { public void run() {
((MyStyledDocument) e.getDocument()).applyStyle();
}});
}
});
pane.setText("FooBar");
this.setContentPane(pane);
}
public static void main(String[] args) {
Gui gui = new Gui();
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setVisible(true);
}
}
默认情况下,文本以蓝色显示。切换到使用JXEditorPane(1个语句更改)给出的内容与未着色的文本相同。