Мне нужно добавить разноцветные слова к тексту в 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, но это означало бы много дополнительных усилий с другими частями приложения, которых я бы хотел избежать, если есть другой способ. Любые намеки высоко ценятся.