Para permitir que el usuario interact�e con los graficos que hemos dibujado, necesitamos poder determinar cuando el usuario pulsa sobre uno de ellos. El m�todo hit de Graphics2D proporciona una forma para determinar f�cilmente si ha ocurrido una pulsaci�n de rat�n sobre una Shape particular. De forma alternativa podemos obtener la posici�n del click de rat�n y llamar a contains sobre la Shape para determinar si el click ocurri� dentro de los l�mites de la Shape.
Si estamos usando texto primitvo, podemos realizar una simple comprobaci�n obteniendo la l�nea exterior de la Shape que corresponde al texto y luego llamando a hit o contains con esa Shape. El soporte de edici�n de texto requiere una comprobaci�n mucho m�s sofisticada. Si queremos permitir que el usuario edite el texto, generalmente deber�amos usar uno de los componentes de texto editable de Swing. Si estamos trabajando con texto primitivo y estamos usando TextLayout para manejar la forma y posici�n del texto, tambi�n podemos usar TextLayout para realizar la comprobaci�n para la edici�n de texto. Para m�s informaci�n puedes ver Java 2D Programmer's Guide.
�Ejemplo: ShapeMover
Este applet permite al usuario arrastrar la Shape por la ventana del
applet. La Shape se redibuja en cada nueva posici�n del rat�n para
proporcionar informaci�n al usuario mientras la arrastra.

Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El applet aparecer� en una nueva ventana del navegador.
ShapeMover.java contiene el c�digo completo de este applet.
Se llama al m�todo contains para determinar si el cursor est� dentro de los l�mites del rect�ngulo cuando se pulsa el bot�n. Si es as�, se actualiza la posici�n del rect�ngulo.
public void mousePressed(MouseEvent e){
last_x = rect.x - e.getX();
last_y = rect.y - e.getY();
if(rect.contains(e.getX(), e.getY())) updateLocation(e);
...
public void updateLocation(MouseEvent e){
rect.setLocation(last_x + e.getX(), last_y + e.getY());
...
repaint();
Podr�as haber sobservado que redibujar la Shape en cada posici�n del rat�n es muy lento, porque el rect�ngulo relleno es renderizado cada vez que se mueve, Usando el doble buffer podemos eliminar este problema. Si estamos usando Swing, el dibujo usar� doble buffer autom�ticamente; si no es as� tendremos que cambiar todo el c�digo de renderizado. El c�digo para una versi�n swing de este programa es SwingShapeMover.java . Para ejecutar la versi�n Swing, visita SwingShapeMover.
Si no estamos usando Swing, el Ejemplo: BufferedShapeMover en la siguiente lecci�n nos muestra c�mo podemos implementar el doble buffer usando un BufferedImage. Podemos dibujar en un BufferedImage y luego copiar la imagen en la pantalla.
�Ejemplo: HitTestSample
Esta aplicaci�n ilustra la comprobaci�n de pulsaciones dibujando el cursor por defecto
siempre que el usuario pulse sobre el TextLayout, como se muestra en
la siguiente figura.

Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El applet aparecer� en una nueva ventana del navegador.
HitTestSample.java contiene el c�digo completo de este applet.
El m�todo mouseClicked usa TextLayout.hitTestChar para devolver un objeto java.awt.font.TextHitInfo que contiene la posici�n del click (el �ndice de inserci�n) en el objeto TextLayout.
La informaci�n devuelta por los m�todos de TextLayout, getAscent, getDescent y getAdvance se utiliza para calcular la posici�n del origen del objeto TextLayout para que est� centrado tanto horizontal como verticalmente.
...
private Point2D computeLayoutOrigin() {
Dimension size = getPreferredSize();
Point2D.Float origin = new Point2D.Float();
origin.x = (float) (size.width - textLayout.getAdvance()) / 2;
origin.y =
(float) (size.height - textLayout.getDescent()
+ textLayout.getAscent())/2;
return origin;
}
...
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(Color.white);
Graphics2D graphics2D = (Graphics2D) g;
Point2D origin = computeLayoutOrigin();
graphics2D.translate(origin.getX(), origin.getY());
// Draw textLayout.
textLayout.draw(graphics2D, 0, 0);
// Retrieve caret Shapes for insertionIndex.
Shape[] carets = textLayout.getCaretShapes(insertionIndex);
// Draw the carets. carets[0] is the strong caret and
// carets[1] is the weak caret.
graphics2D.setColor(STRONG_CARET_COLOR);
graphics2D.draw(carets[0]);
if (carets[1] != null) {
graphics2D.setColor(WEAK_CARET_COLOR);
graphics2D.draw(carets[1]);
}
}
...
private class HitTestMouseListener extends MouseAdapter {
/**
* Compute the character position of the mouse click.
*/
public void mouseClicked(MouseEvent e) {
Point2D origin = computeLayoutOrigin();
// Compute the mouse click location relative to
// textLayout's origin.
float clickX = (float) (e.getX() - origin.getX());
float clickY = (float) (e.getY() - origin.getY());
// Get the character position of the mouse click.
TextHitInfo currentHit = textLayout.hitTestChar(clickX, clickY);
insertionIndex = currentHit.getInsertionIndex();
// Repaint the Component so the new caret(s) will be displayed.
hitPane.repaint();
}