javaswingawtjava-2dstyledtext

Changing the colour of text in drawstring()


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?


Solution

  • 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();
                }
            });
        }
    }