Changing the colour of text in drawstring()

Chris Headleand picture Chris Headleand · Dec 10, 2012 · Viewed 32.8k times · Source

I'm trying to add emphasis to one work in a string im drawing using swing.

I was advised to use HTML with the following code:

Graphics2D g2 = (Graphics2D) g;
g.drawString("this is something I want people to <p color="#00FF00">NOTICE</p>", x, y);

I tried this but had no luck... it just outputs the HTML

Can anyone point me in the right direction?

Answer

David Kroukamp picture David Kroukamp · Dec 10, 2012
  • How does this compile: g.drawString("this is something I want people to <p color="#00FF00">NOTICE</p>", x, y); as ' " ' is a special character we must escape it with \

  • You cast to Graphics2D but dont use it (not relevant to problem but can cause anomalies).

It should be:

Graphics2D g2 = (Graphics2D) g;
g2.drawString("this is something I want people to <p color=\"#00FF00\">NOTICE</p>", x, y);

to add colour simply call setColor(Color c) on Graphics object:

g2.setColor(Color.GREEN);

However this will set the entire String to be drawn green, if you want only parts to be drawn green use JLabel for HTML support (up to HTML3.2):

JLabel label = new JLabel("<html>this is something I want people to <p color=\"#00FF00\">NOTICE</p></html>");

full example:

enter image description here

NB As you can see notice is on its own line thats because of the paragraph tag rather use font tag to get it on a single line like so:

enter image description here

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test {

    public Test() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel label = new JLabel("<html>this is something I want people to <p color=\"#00FF00\">NOTICE</p></html>");

        // JLabel label = new JLabel("<html>this is something I want people to <font color=\"#00FF00\">NOTICE</font></html>");//will be shown on single line

        frame.add(label);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }
}