Question

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?

Était-ce utile?

La solution

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

Autres conseils

Use Graphics.setColor() to change the color of anything you do. Or use a JLabel to set the color on.

Use a JLabel for styled text. See LabelRenderTest for how it can be drawn to an image & used in paint.

Using Graphics/AWT methods

The string implies NOTICE should be green, but the rest default (black). We would need to call drawString(String) twice with the colors of the two parts of the string, offsetting the latter string by the width of the first. To get the width, see things like FontMetrics or a GlyphVector. This answer uses a GlyphVector to get an outline of the letters.

If you're just creating a simple label with emphasis on a word, you can just assign the HTML straight onto the JLabel like this...

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

As long as you have the <html> piece at the beginning of the String for a JLabel, it will use the HTML renderer to paint it.

As pointed out by @AndrewThompson, however, the <p> will force the colored text on to a new line, so perhaps <span> would be more appropriate...

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

you can use g.setColor(Color.BLUE) before g.drawString(). (For example Color.BLUE)

You could add g.setColor(Color.Chosen Color);and then write the string out with g.drawString() perhaps

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top