import java.awt.*;
import java.awt.font.*;
import javax.swing.*;
import java.awt.geom.*;

public class ScaleProblem extends JPanel
{

        private String text = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
        private AffineTransform affineTransform = new AffineTransform();


        public ScaleProblem()
        {
                super();
                setBackground(Color.white);
        }

        public void paintComponent(Graphics g)
        {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;

                java.awt.RenderingHints oldRenderingHints = g2d.getRenderingHints();
                g2d.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON);

                Font aFont = new Font("Courier New", Font.PLAIN, 10);

                double scale = 1;
                float y = 20;

                for (int i = 1; i < 21; i++)
                {
                        AffineTransform oldTransform = g2d.getTransform();

                        affineTransform.setToIdentity();
                        affineTransform.translate(-10, -y * i);
                        affineTransform.scale(scale + (i * .1), 1);
                        affineTransform.translate(10, y * i);
                        g2d.transform(affineTransform);

                        TextLayout textLayout = new TextLayout(text, aFont, g2d.getFontRenderContext());
                        textLayout.draw(g2d, 10, y * i);

                        Rectangle2D bounds = textLayout.getBounds();
                        bounds.setRect(10 + bounds.getX(), (y * i) + bounds.getY(), bounds.getWidth(), bounds.getHeight());
                        g2d.draw(bounds);

                        g2d.setTransform(oldTransform);
                }

                g2d.setRenderingHints(oldRenderingHints);
        }

        public static void main(String[] args)
        {
                ScaleProblem sProblem = new ScaleProblem();
                if(args!=null && args.length>0)
                {
                        sProblem.text = args[0];
                }
                System.out.println("Using text="+sProblem.text);

                JFrame frameHolder = new JFrame("Textlayout scale problem");
                frameHolder.getContentPane().add(sProblem);
                frameHolder.setSize(600, 400);
                frameHolder.show();
        }
}