Caret action : Text Layout « 2D Graphics GUI « Java

Caret action

Caret action

import java.awt.BasicStroke;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.font.FontRenderContext;
import java.awt.font.TextAttribute;
import java.awt.font.TextHitInfo;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class TextLayoutWithCarets extends JLabel {
  private TextHitInfo mHit;

  private TextLayout mLayout;

  private boolean mInitialized = false;

  public TextLayoutWithCarets() {
    addKeyListener(new KeyListener() {
      public void keyPressed(KeyEvent ke) {
        if (ke.getKeyCode() == KeyEvent.VK_RIGHT) {
          mHit = mLayout.getNextRightHit(mHit.getInsertionIndex());
          if (mHit == null)
            mHit = mLayout.getNextLeftHit(1);
        } else if (ke.getKeyCode() == KeyEvent.VK_LEFT) {
          mHit = mLayout.getNextLeftHit(mHit.getInsertionIndex());
          if (mHit == null)
            mHit = mLayout.getNextRightHit(mLayout
                .getCharacterCount() - 1);

      public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

      public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub


  private void initialize(Graphics2D g2) {
    String s = "Java Source and Support.";
    // Create a plain and italic font.
    int fontSize = 32;
    Font font = new Font("Lucida Sans Regular", Font.PLAIN, fontSize);
    Font italicFont = new Font("Lucida Sans Oblique", Font.ITALIC, fontSize);
    // Create an Attributed String
    AttributedString as = new AttributedString(s);
    as.addAttribute(TextAttribute.FONT, font);
    as.addAttribute(TextAttribute.FONT, italicFont, 2, 5);
    // Get the iterator.
    AttributedCharacterIterator iterator = as.getIterator();
    // Create a TextLayout.
    FontRenderContext frc = g2.getFontRenderContext();
    mLayout = new TextLayout(iterator, frc);

    mHit = mLayout.getNextLeftHit(1);
    // Respond to left and right arrow keys.

    mInitialized = true;

  public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;

    if (mInitialized == false)

    float x = 20, y = 80;
    mLayout.draw(g2, x, y);

    // Create a plain stroke and a dashed stroke.
    Stroke[] caretStrokes = new Stroke[2];
    caretStrokes[0] = new BasicStroke();
    caretStrokes[1] = new BasicStroke(1, BasicStroke.CAP_BUTT,
        BasicStroke.JOIN_ROUND, 0, new float[] { 4, 4 }, 0);

    // Now draw the carets
    Shape[] carets = mLayout.getCaretShapes(mHit.getInsertionIndex());
    for (int i = 0; i < carets.length; i++) {
      if (carets[i] != null) {
        AffineTransform at = AffineTransform.getTranslateInstance(x, y);
        Shape shape = at.createTransformedShape(carets[i]);

  public static void main(String[] args) {
    JFrame f = new JFrame();
    f.getContentPane().add(new TextLayoutWithCarets());
    f.setSize(350, 250);




Related examples in the same category

1.JFreeChart: Draw String DemoJFreeChart: Draw String Demo
2.Unicode: test layoutUnicode: test layout
3.Unicode displayUnicode display
4.Line break for textlayoutLine break for textlayout
5.Mouse hit and textlayoutMouse hit and textlayout
6.TextLayout demoTextLayout demo
7.Draw text along a curveDraw text along a curve
8.TextHitInfo Demo: tell you which is the letter you are clickingTextHitInfo Demo: tell you which is the letter you are clicking
9.TextAttribute: Underline and strike throughTextAttribute: Underline and strike through
10.TextAttribute: color and fontTextAttribute: color and font
11.Hightlight text by drag and selectionHightlight text by drag and selection
12.LineMetrics: the metrics to layout characters along a lineLineMetrics: the metrics to layout characters along a line
13.Paragraph LayoutParagraph Layout
14.Caret and TextLayoutCaret and TextLayout
15.Another Line Break Demo
16.A display of text, formatted by us instead of by AWT/SwingA display of text, formatted by us instead of by AWT/Swing
17.Draw text with TextLayout
18.Drawing a Paragraph of Text
19.Getting the Shape from the Outline of Text
20.Drawing Text with Mixed Styles
21.Drawing multi-line text with AttributedString and LineBreakMeasurer
22.Draws the string at the specified location underlining the specified character
23.Renders a paragraph of text (line breaks ignored) to an image (created and returned).