
Java : Personalizando componentes
A veces uno quisiera personalizar componentes en JAVA esto es super sencillo, por ejemplo si quisiera un JTextField como los de
Deskbar que tiene algo como una lupa en el textfield.
Qué haremos ?: Un
JTextField que tenga incluido una imagen.

Jtextfield que haremos.
Manos a la obra :

El icono que utilizaremos en el ejemplo.
*Para empezar crearemos
una clase que extienda de JTextField, que sera la clase que personalizaremos.
*Luego
declaramos la imagen que se dibujara, en el ejemplo se llama "stock_zoom.png"
//la imagen que incorporare al componente
String urlImage = getClass().getResource("stock_zoom.png");
private Image image = new ImageIcon( urlImage ).getImage();
*Para agregar la imagen del JtextField lo que modificaremos sera la forma de pintarse del componente. o sea tendremos que
Sobrescribir el método paint
para que además de dibujar el componente por defecto dibuje una imagen.
//sobrescribiendo el componente
@Override
public void paint(Graphics g)
{
if ( isVisible() )
{
super.paint(g);//llamando al dibujado por defecto
g.drawImage( image, 0, 0, null); // dibujo la imagen
}
}
*En el código se ve como después de dibujar el componente por defecto, dibuja
una imagen.
Hasta ahora ya esta listo se ve como teniamos pensado al comienzo, salvo que la posición del cursor es tapada por la imagen. asi que nos
falta setear el Margen del componente al tamaño de la imagen al momento de construir el objeto.
//agrego un margen en los constructores
{
getMargin().left = image.getWidth(null);
}
y listo eso seria las partes importantes del codigo y si tienes sugerencias ideas dudas, o quieren mejorar el JTextField con esquinas curvadas ..etc.. dejen el comentario
Y ahora el codigo completo...
Imagen que debe estar en el mismo directorio de la clase :

codigo:
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.text.Document;
/**
* @author flavin
* @date 15-08-2006
* @version $Id$
*/
public class BotonBusqueda extends JTextField{
//la imagen que incorporare al componente
private Image image =
new ImageIcon( getClass().getResource("stock_zoom.png") )
.getImage();
{//agrego un margen constructores
getMargin().left = image.getWidth(null);
}
//agrego los constructores del jtextfield
public BotonBusqueda() {
super();
}
public BotonBusqueda(Document doc,String text,int columns) {
super(doc, text, columns);
}
public BotonBusqueda(int columns) {
super(columns);
}
public BotonBusqueda(String text, int columns) {
super(text, columns);
}
public BotonBusqueda(String text) {
super(text);
}
@Override
public void paint(Graphics g)
{
if ( isVisible() ) { //sobrescribiendo el componente
super.paint(g);
g.drawImage( image, 0, 0, null); // dibujo la imagen
}
}
public static void main(String[] args) {
JFrame jframe = new JFrame();
jframe.setDefaultCloseOperation(
WindowConstants.EXIT_ON_CLOSE );
jframe.add( new BotonBusqueda() );
jframe.pack();
jframe.setVisible( true );
}
}