Mega Code Archive

 
Categories / Java / Swing JFC
 

A custom caret class

/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O'Reilly  */ // CornerCaret.java //A custom caret class. // import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.Rectangle; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultCaret; import javax.swing.text.JTextComponent; public class CornerCaret extends DefaultCaret {   public CornerCaret() {     setBlinkRate(500); // half a second   }   protected synchronized void damage(Rectangle r) {     if (r == null)       return;     // give values to x,y,width,height (inherited from java.awt.Rectangle)     x = r.x;     y = r.y + (r.height * 4 / 5 - 3);     width = 5;     height = 5;     repaint(); // calls getComponent().repaint(x, y, width, height)   }   public void paint(Graphics g) {     JTextComponent comp = getComponent();     if (comp == null)       return;     int dot = getDot();     Rectangle r = null;     try {       r = comp.modelToView(dot);     } catch (BadLocationException e) {       return;     }     if (r == null)       return;     int dist = r.height * 4 / 5 - 3; // will be distance from r.y to top     if ((x != r.x) || (y != r.y + dist)) {       // paint() has been called directly, without a previous call to       // damage(), so do some cleanup. (This happens, for example, when       // the       // text component is resized.)       repaint(); // erase previous location of caret       x = r.x; // set new values for x,y,width,height       y = r.y + dist;       width = 5;       height = 5;     }     if (isVisible()) {       g.setColor(comp.getCaretColor());       g.drawLine(r.x, r.y + dist, r.x, r.y + dist + 4); // 5 vertical                                 // pixels       g.drawLine(r.x, r.y + dist + 4, r.x + 4, r.y + dist + 4); // 5 horiz                                     // px     }   }   public static void main(String args[]) {     JFrame frame = new JFrame("CornerCaret demo");     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     JTextArea area = new JTextArea(8, 32);     area.setCaret(new CornerCaret());     area         .setText("This is the story\nof the hare who\nlost his spectacles.");     frame.getContentPane().add(new JScrollPane(area), BorderLayout.CENTER);     frame.pack();     frame.setVisible(true);   } }