Mega Code Archive

 
Categories / Java Tutorial / 2D Graphics
 

Text Layout with mouse clicking and selecting action

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.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 TextLayoutWithMouseClickDrag{   public static void main(String arg[]) {     JFrame frame = new JFrame();     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     frame.getContentPane().add("Center", new DisplayPanel());     frame.pack();     frame.setSize(new Dimension(400, 300));     frame.setVisible(true);   } } class DisplayPanel extends JPanel {   FontRenderContext frc = new FontRenderContext(null, false, false);   Font font = new Font("Arial", Font.PLAIN, 36);   Rectangle2D rect;   float rx, ry, rw, rh;   TextHitInfo hitInfo;   Color caretColor;   int hit1, hit2;   int w=400, h=200;   TextLayout layout = new TextLayout("j a v a 2 s . c o m", font, frc);   public DisplayPanel() {     setSize(400, 200);     addMouseListener(new MouseHandler());     addMouseMotionListener(new MouseMotionHandler());     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);   }   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);     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();     }   } }