import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.TextLayout;
import java.text.AttributedString;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class FontMetricsVsTextLayout {
	  static JPanel area =null;
	  public static void main(String[] args) throws InterruptedException {
	    area = new JPanel() {
	      

	      @Override
	      protected void paintComponent(Graphics g) {
	        super.paintComponent(g);
	        int x = 0;
	        int y = 20;
	        
	        String str = "ABCDEFGHIJKLABCDEFGHIJKL";
	        Font baseFont = g.getFont();
	        baseFont = baseFont.deriveFont(16f);
	        Font monospaceFont = new Font("Monospaced", Font.PLAIN, 14);
	        
	        //Use drawString
	        g.setFont(monospaceFont);
	        g.drawString(str, x, y);
	        //Compute width using "stringWidth"
	        int w = area.getFontMetrics(g.getFont()).stringWidth(str);

	        //Add some suffix after the content
	        x += w;
	        g.setFont(baseFont);
	        g.drawString("ZZZZ", x, y);
	        
	        y += 20;
	        x = 0;
	        //Use draw attributed string
	        g.setFont(monospaceFont);
	        AttributedString astr = new AttributedString(str);
	        astr.addAttribute(java.awt.font.TextAttribute.FONT, monospaceFont);
	        g.drawString(astr.getIterator(), x, y);
	        //Compute width using "stringWidth"
	        w = area.getFontMetrics(g.getFont()).stringWidth(str);

	        //Add some suffix after
	        x += w;
	        astr = new AttributedString("ZZZZ");
	        astr.addAttribute(java.awt.font.TextAttribute.FONT, baseFont);
	        g.drawString(astr.getIterator(), x, y);
	        
	        //Use textlayout to draw the string
	        y += 20;
	        x = 0;
	        Graphics2D g2d = ((Graphics2D)g);
	        
	        TextLayout tl = new TextLayout(str, monospaceFont, g2d.getFontRenderContext());
	        tl.draw(g2d, x, y);
	        //Compute the width using tl.getAdvance()
	        x+= tl.getAdvance();
	        
	        //Add some suffix after it.
	        tl = new TextLayout("ZZZZ", baseFont, g2d.getFontRenderContext());
	        tl.draw(g2d, x, y);
	      }
	    };
	    area.setOpaque(true);
	    JFrame frame = new JFrame();
	    frame.getContentPane().add(new JScrollPane(area));
	    frame.setVisible(true);
	    frame.setSize(400, 600);
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    Thread.sleep(10000);
	  }
	} 