Добавить разноцветные слова в JEditorPane без использования тегов HTML - PullRequest
0 голосов
/ 15 января 2019

Мне нужно добавить разноцветные слова к тексту в JEditorPane, но я не могу использовать HTML.

Для JTextPanes есть несколько способов достижения этого (см. Пример с пользовательской функцией добавления ниже). Тем не менее, мое приложение нуждается в JEditorPane.

Я знаю, что здесь, на SO, есть несколько похожих вопросов (например, JEditorPane устанавливает цвет переднего плана для разных слов ), но большинство ответов в конце концов прибегают к JTextPane.

// example for JTextPane: appends text to the pane in 2 different ways
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;
import javax.swing.text.*;

public class MyPane extends JTextPane {

    public MyPane(){
        this.setEditable(false);
    }

// there's at least 2 ways to append colored text to a JTextPane
    public void append(Color c, String s) {
        this.setEditable(true);
        StyleContext sc = StyleContext.getDefaultStyleContext();
        AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY,
                StyleConstants.Foreground, c);

// 1st possibility: set caret to the end of the text and use replaceSelection
        int len = getDocument().getLength();
        setCaretPosition(len);
        setCharacterAttributes(aset, false);
        replaceSelection(s);
        this.setEditable(false);

// 2nd possibility: use StyledDocument.insertString()
        StyledDocument doc = this.getStyledDocument();
        try {
            doc.insertString(doc.getLength(), s, aset);
        } catch (BadLocationException ex) {
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        MyPane pane = new MyPane();
        pane.append(Color.red, "test1 ");
        pane.append(Color.blue, "test2 ");


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(200, 200));
        frame.getContentPane().add(pane);
        frame.pack();
        frame.setVisible(true);
    }
}

Я мог бы использовать JTextPane, но это означало бы много дополнительных усилий с другими частями приложения, которых я бы хотел избежать, если есть другой способ. Любые намеки высоко ценятся.

...