I have a JTextPane
and I want to change it's foreground
sometimes. The problem is, if to switch the ContentType
of JTextPane
to text/html
, my call jTextPane.setForeground(myColor)
does not appear. How can I fix that?
SSCCE:
public class TextAreaTest {
public static void main(String[] a) {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTextPane textArea = new JTextPane();
textArea.setEditable(false);
textArea.setFocusable(false);
textArea.setText("<html>First line text<br>Second line text</html>");
final JPanel panel = new JPanel(new FlowLayout());
final JCheckBox htmlOnOff = new JCheckBox("HTML");
htmlOnOff.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textArea.setContentType(htmlOnOff.isSelected() ? "text/html" : "text/plane");
textArea.setText("<html>First line text<br>Second line text</html>");
}
});
JToggleButton buttonRed = new JToggleButton("Red");
buttonRed.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textArea.setForeground(Color.RED);
}
});
JToggleButton buttonGreen = new JToggleButton("Green");
buttonGreen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textArea.setForeground(Color.GREEN);
}
});
JToggleButton buttonBlue = new JToggleButton("Blue");
buttonBlue.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textArea.setForeground(Color.BLUE);
}
});
panel.add(htmlOnOff);
panel.add(buttonRed);
panel.add(buttonGreen);
panel.add(buttonBlue);
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(buttonRed);
buttonGroup.add(buttonBlue);
buttonGroup.add(buttonGreen);
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout(0, 0));
contentPane.add(panel, BorderLayout.NORTH);
contentPane.add(textArea, BorderLayout.CENTER);
frame.setContentPane(contentPane);
frame.setUndecorated(true);
Dimension size = new Dimension(275, 80);
frame.setSize(size);
frame.setPreferredSize(size);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.setVisible(true);
System.out.println(frame.getSize());
}
});
}
}
UPDATE#1
I noticed that JLabel
is able to do what I want. But I can't use it :(
Thanks you all, but I've found the answer with myself:
StyledDocument doc = textPane.getStyledDocument();
SimpleAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setForeground(attrs, myColor);
doc.setParagraphAttributes(0, doc.getLength(), attrs, false);
textPane.setDocument(doc);