Java by API/javax.swing.text/DefaultCaret

Материал из Java эксперт
Перейти к: навигация, поиск

extends DefaultCaret

   <source lang="java">

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 FancyCaret extends DefaultCaret {

 protected synchronized void damage(Rectangle r) {
   if (r == null)
     return;
   x = r.x;
   y = r.y;
   height = r.height;
   if (width <= 0)
     width = getComponent().getWidth();
   repaint();
 }
 public void paint(Graphics g) {
   JTextComponent comp = getComponent();
   if (comp == null)
     return;
   int dot = getDot();
   Rectangle r = null;
   char dotChar;
   try {
     r = comp.modelToView(dot);
     if (r == null)
       return;
     dotChar = comp.getText(dot, 1).charAt(0);
   } catch (BadLocationException e) {
     return;
   }
   if ((x != r.x) || (y != r.y)) {
     repaint();
     x = r.x;
     y = r.y;
     height = r.height;
   }
   g.setColor(comp.getCaretColor());
   g.setXORMode(comp.getBackground());
   if (dotChar == "\n") {
     int diam = r.height;
     if (isVisible())
       g.fillArc(r.x - diam / 2, r.y, diam, diam, 270, 180); // half circle
     width = diam / 2 + 2;
     return;
   }
   if (dotChar == "\t")
     try {
       Rectangle nextr = comp.modelToView(dot + 1);
       if ((r.y == nextr.y) && (r.x < nextr.x)) {
         width = nextr.x - r.x;
         if (isVisible())
           g.fillRoundRect(r.x, r.y, width, r.height, 12, 12);
         return;
       } else
         dotChar = " ";
     } catch (BadLocationException e) {
       dotChar = " ";
     }
   width = g.getFontMetrics().charWidth(dotChar);
   if (isVisible())
     g.fillRect(r.x, r.y, width, r.height);
 }
 public static void main(String args[]) {
   JFrame frame = new JFrame("FancyCaret demo");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JTextArea area = new JTextArea(8, 32);
   area.setCaret(new FancyCaret());
   area.setText("VI\tVirgin Islands \nVA      Virginia\nVT\tVermont");
   frame.getContentPane().add(new JScrollPane(area), BorderLayout.CENTER);
   frame.pack();
   frame.setVisible(true);
 }

}

      </source>