Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

Hightlight text by drag and selection

import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; 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 javax.swing.JFrame; import javax.swing.JPanel; public class Highlights extends JPanel {   private TextLayout textLayout;   private TextHitInfo firstHit, secondHit;   private int x = 40, y = 80;     public Highlights(){     addMouseListener(new MouseAdapter() {       public void mousePressed(MouseEvent me) {         firstHit = textLayout.hitTestChar(me.getX() - x, me.getY()             - y);         secondHit = null;       }       public void mouseReleased(MouseEvent me) {         secondHit = textLayout.hitTestChar(me.getX() - x, me.getY()             - y);         repaint();       }     });     addMouseMotionListener(new MouseMotionAdapter() {       public void mouseDragged(MouseEvent me) {         secondHit = textLayout.hitTestChar(me.getX() - x, me.getY()             - y);         repaint();       }     });              }   public void paint(Graphics g) {     Graphics2D g2 = (Graphics2D) g;     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,         RenderingHints.VALUE_ANTIALIAS_ON);     g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,         RenderingHints.VALUE_FRACTIONALMETRICS_ON);     String s = "Drag the text to highlight Java Source and Support.";     Font font = new Font("Serif", Font.PLAIN, 32);     if (textLayout == null) {       FontRenderContext frc = g2.getFontRenderContext();       textLayout = new TextLayout(s, font, frc);     }     // Draw the highlight.     if (firstHit != null && secondHit != null) {       Shape base = textLayout.getLogicalHighlightShape(firstHit           .getInsertionIndex(), secondHit.getInsertionIndex());       AffineTransform at = AffineTransform.getTranslateInstance(x, y);       Shape highlight = at.createTransformedShape(base);       g2.setPaint(Color.white);       g2.fill(highlight);     }     g2.setPaint(Color.black);     textLayout.draw(g2, x, y);   }   public static void main(String[] args) {     JFrame f = new JFrame();     f.getContentPane().add(new Highlights());     f.setSize(850, 250);     f.show();   } }