TextLayoutPanel.java Source code

Java tutorial

Introduction

Here is the source code for TextLayoutPanel.java

Source

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.font.FontRenderContext;
import java.awt.font.TextHitInfo;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TextLayoutPanel extends JPanel {
    TextLayout layout;

    FontRenderContext frc;

    Font font;

    Rectangle2D rect;

    float rx, ry, rw, rh;

    TextHitInfo hitInfo;

    Color caretColor;

    int hit1, hit2;

    int w, h;

    public TextLayoutPanel() {
        setBackground(Color.white);
        setForeground(Color.black);
        setSize(400, 200);
        addMouseListener(new MouseHandler());
        addMouseMotionListener(new MouseMotionHandler());
        w = getWidth();
        h = getHeight();

        String text = "Java Source and Support";
        font = new Font("Arial", Font.PLAIN, 36);
        frc = new FontRenderContext(null, false, false);
        layout = new TextLayout(text, font, frc);

        rx = (float) (w / 2 - layout.getBounds().getWidth() / 2);
        ry = (float) 3 * h / 4;
        rw = (float) (layout.getBounds().getWidth());
        rh = (float) (layout.getBounds().getHeight());
        rect = new Rectangle2D.Float(rx, ry, rw, rh);

        caretColor = getForeground();
    }

    public void update(Graphics g) {
        g.clearRect(0, 0, getWidth(), getHeight());
        paintComponent(g);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        AffineTransform at = AffineTransform.getTranslateInstance(rx, ry);

        Shape hilight = layout.getLogicalHighlightShape(hit1, hit2);
        hilight = at.createTransformedShape(hilight);
        g2.setColor(Color.lightGray);
        g2.fill(hilight);

        g2.setColor(Color.black);
        layout.draw(g2, rx, ry);

        // Draw caret
        Shape[] caretShapes = layout.getCaretShapes(hit1);
        Shape caret = at.createTransformedShape(caretShapes[0]);
        g2.setColor(caretColor);
        g2.draw(caret);
    }

    public int getHitLocation(int mouseX, int mouseY) {
        hitInfo = layout.hitTestChar(mouseX, mouseY, rect);
        return hitInfo.getInsertionIndex();
    }

    class MouseHandler extends MouseAdapter {
        public void mouseClicked(MouseEvent e) {
            caretColor = getForeground();
            hit1 = getHitLocation(e.getX(), e.getY());
            hit2 = hit1;
            repaint();
        }

        public void mousePressed(MouseEvent e) {
            caretColor = getForeground();
            hit1 = getHitLocation(e.getX(), e.getY());
            hit2 = hit1;
            repaint();
        }

        public void mouseReleased(MouseEvent e) {
            hit2 = getHitLocation(e.getX(), e.getY());
            repaint();
        }
    }

    class MouseMotionHandler extends MouseMotionAdapter {
        public void mouseDragged(MouseEvent e) {
            caretColor = getBackground();
            hit2 = getHitLocation(e.getX(), e.getY());
            repaint();
        }
    }

    public static void main(String arg[]) {
        JFrame frame = new JFrame();
        frame.setBackground(Color.white);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.getContentPane().add("Center", new TextLayoutPanel());
        frame.pack();
        frame.setSize(new Dimension(400, 300));
        frame.setVisible(true);
    }
}