Как реализовать фантазии каретки для Applic

Этот совет Java Swing иллюстрирует метод реализации фантазия каретка для вашего приложения. Разработчики могут использовать это в игровых приложениях, чтобы предоставить анимированный каретки для пользователей.



javax.swing



import javax.swing.*;

import javax.swing.text.*;

import java.awt.*;



public class FancyCaret extends DefaultCaret {



  protected synchronized void damage(Rectangle r) {

    if (r == nullreturn;



    // give values to x,y,width,height (inherited from java.awt.Rectangle)

    x = r.x; 

    y = r.y;

    height = r.height;

    // A value for width was probably set by paint(), which we leave alone.

    // But the first call to damage() precedes the first call to paint(), so

    // in this case we must be prepared to set a valid width, or else paint()

    // will receive a bogus clip area and caret will not get drawn properly.

    if (width <= 0width = getComponent().getWidth();



    repaint()// calls getComponent().repaint(x, y, width, height)

  }



  public void paint(Graphics g) {

    JTextComponent comp = getComponent();

    if (comp == nullreturn;



    int dot = getDot();

    Rectangle r = null;

    char dotChar;

    try 

      r = comp.modelToView(dot);

      if (r == nullreturn;

      dotChar = comp.getText(dot, 1).charAt(0);

    catch (BadLocationException e) { return}



    if ( (x != r.x|| (y != r.y) ) {

      // 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;   // Update dimensions (width gets set later in this method)

      y = r.y;

      height = r.height;

    }



    g.setColor(comp.getCaretColor());

    g.setXORMode(comp.getBackground())// do this to draw in XOR mode



    if (dotChar == '\n') {

      int diam = r.height;

      if (isVisible())

        g.fillArc(r.x-diam/2, r.y, diam, diam, 270180)// half circle

      width = diam / 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, 1212);

        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(832);

    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);

  }

}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>