如何在JXEditorPane中显示样式文本

时间:2015-02-25 15:28:21

标签: java swing swingx

我在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个语句更改)给出的内容与未着色的文本相同。

0 个答案:

没有答案