JTextPane text background color does not work
background-color, java, jtextpane, styleddocument, swing
Solution
Here is the code for an Action that can set the background color:
public class BackgroundColorAction extends StyledEditorKit.StyledTextAction {
private Color color;
public BackgroundColorAction(Color color) {
super(StyleConstants.Background.toString());
this.color = color;
}
@Override
public void actionPerformed(ActionEvent ae) {
JEditorPane editor = getEditor(ae);
if (editor == null) {
return;
}
//Add span Tag
String htmlStyle = "background-color:" + Util.getHTMLColor(color);
SimpleAttributeSet attr = new SimpleAttributeSet();
attr.addAttribute(HTML.Attribute.STYLE, htmlStyle);
MutableAttributeSet outerAttr = new SimpleAttributeSet();
outerAttr.addAttribute(HTML.Tag.SPAN, attr);
//Next line is just an instruction to editor to change color
StyleConstants.setBackground(outerAttr, this.color);
setCharacterAttributes(editor, outerAttr, false);
}
}
I had lot of trouble setting background color. But finally, I have managed to crack it.` Sorry I forgot to post the subroutine. Here you go:
/**
* Convert a Java Color to equivalent HTML Color.
*
* @param color The Java Color
* @return The String containing HTML Color.
*/
public static String getHTMLColor(Color color) {
if (color == null) {
return "#000000";
}
return "#" + Integer.toHexString(color.getRGB()).substring(2).toUpperCase();
}
Problem
I am trying to make a small HTML-wysiwyg with a `JTextPane` but I can't get the `BackgroundAction` to work. I am using `setCharacterAttributes` on the `StyledDocument` of the `JTextPane` but it seems problematic. The view is ok but the `Document` is not. Here is a small demo code showing the problem. There are 2 `JTextPane`: - I set the background color of my text in the first one - I retrieve the text of the first `JTextPane` and set it on the second one --> They don't show the same thing although they have the same text. Is there a way to set the background color on the current selected text and have the `JTextPane` report an updated HTML-text? ``` import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextPane; import javax.swing.SwingUtilities; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; public class TestDifferentStyles { private void initUI() { JFrame frame = new JFrame(TestDifferentStyles.class.getSimpleName()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JTextPane textPane = new JTextPane(); final JTextPane textPane2 = new JTextPane(); textPane2.setEditable(false); textPane.setContentType("text/html"); textPane2.setContentType("text/html"); textPane.setText("<html><head></head><body><p>Hello world</p></body></html>"); SimpleAttributeSet set = new SimpleAttributeSet(); StyleConstants.setForeground(set, Color.GREEN); StyleConstants.setBackground(set, Color.BLACK); ((StyledDocument) textPane.getDocument()).setCharacterAttributes(0, textPane.getDocument().getLength(), set, false); JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1.0; gbc.weighty = 1.0; panel.add(textPane, gbc); panel.add(textPane2, gbc); frame.add(panel); frame.setSize(500, 400); frame.setVisible(true); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { System.err.println(textPane.getText()); textPane2.setText(textPane.getText()); } }); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new TestDifferentStyles().initUI(); } }); } } ``` The output result (the black border are around each `JTextPane`):