
AvatarCircular
Clase visual que permite la representación de un avatar circular con tamaño y color de borde variable dada una imagen.
Esta clase hereda de JComponent.
Este es un componente personalizado cuya idea original se encuentra en este repositorio de DJ Raven.
Preview de Componente en la Prueba Visual:
Índice de Contenido
Constructores
Constructor vacío
- Arquetipo: AvatarCircular()
- Descripción: Permite construir el componente visual AvatarCircular.
- Particularidades: El componente es creado sin avatar (null) y con tamaño del borde = 0.
- Ejemplo de uso: - AvatarCircular avatar = new AvatarCircular();
Constructor con Imagen y Tamaño de borde
- Arquetipo: AvatarCircular(Icon, int)
- Parámetros: Iconimagen a renderizar,intgrosor del borde
- Descripción: Permite construir el componente visual AvatarCircularcon la imagen y grosor del borde dados.
- Particularidades:
- Ejemplo de uso: - AvatarCircular a = new AvatarCircular(new ImageIcon(ClaseBase.class.getResource("/img/avatar.png")),3);
Atributos de interés
Avatar
- Arquetipo: Icon avatar
- Descripción: Iconque determina la imagen del avatar a renderizar.
- Métodos Relacionados: Getter de Avatar y Setter de Avatar
Tamaño del Borde
- Arquetipo: int tamBorde
- Descripción: intque determina el grosor del borde del avatar.
- Métodos Relacionados: Getter de tamaño del borde y Setter de tamaño del borde
Métodos de interés
- Getter de Avatar
- Setter de Avatar
- Getter de Tamaño del Borde
- Setter de Tamaño del Borde
- Cambiar color del Borde
Getter de Avatar
- Arquetipo: getAvatar()
- Descripción: Permite obtener el Iconde la imagen usada para renderizar el avatar circular.
- Atributos Relacionados: Avatar
- Ejemplo de uso: - Icon ico = new AvatarCircular().getAvatar(); // ico = null
Setter de Avatar
- Arquetipo: setAvatar(Icon)
- Parámetros: Iconimagen a renderizar.
- Descripción: Permite la imagen del avatar renderizada.
- Particularidades: Se recomienda que las imágenes sean con formato .jpg(versión ligera) o.png(transparencia). No se guardan los avatares que seannull, sino que se mantiene el valor anteriormente guardado.
- Atributos Relacionados: Avatar
- Ejemplo de uso: - AvatarCircular avatar = new AvatarCircular(); avatar.setAvatar(ClaseBase.class.getResource("/img/avatar.png"));
Getter de Tamaño del Borde
- Arquetipo: getTamBorde()
- Descripción: Permite obtener el tamaño o grosor del borde.
- Atributos Relacionados: Tamaño del Borde
- Ejemplo de uso: - int n = new AvatarCircular().getTamBorde(); // n = 0
Setter de Tamaño del Borde
- Arquetipo: setTamBorde(int)
- Parámetros: intgrosor del borde.
- Descripción: Permite cambiar el tamaño o grosor del borde del avatar.
- Particularidades: No se guardan los grosores menores que 0, sino que se mantiene el valor anteriormente guardado.
- Atributos Relacionados: Tamaño del Borde
- Ejemplo de uso: - AvatarCircular avatar = new AvatarCircular(); avatar.setTamBorde(3);
Cambiar color del Borde
- Arquetipo: setForeground(Color)(Valor Empleado)
- Parámetros: Colordel borde
- Descripción: Permite cambiar el color del borde de este componente visual.
- Particularidades: No se sobreescribe el método original, sino que es usado para con su valor cambiar el color del borde.
- Ejemplo de uso: - AvatarCircular avatar = new AvatarCircular(); avatar.setForeground(Color.RED);
Ejemplo de Uso
public class Prueba extends JFrame {
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private AvatarCircular avatarCircular;
	public Prueba() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		avatarCircular = new AvatarCircular();
		avatarCircular.setForeground(Color.ORANGE);
		avatarCircular.setTamBorde(4);
		avatarCircular.setAvatar(new ImageIcon(Prueba.class.getResource("/img/avatar.png")));
		avatarCircular.setBounds(151, 65, 136, 115);
		contentPane.add(avatarCircular);
	}
}
Código Fuente
public class AvatarCircular extends JComponent{
	private static final long serialVersionUID = 1L;
	private Icon avatar;
	private int tamBorde;
	public AvatarCircular(Icon avatar, int tamBorde) {
		setAvatar(avatar);
		setTamBorde(tamBorde);
	}
	public AvatarCircular(){
		this.avatar=null;
		this.tamBorde=0;
	}
	public Icon getAvatar() {
		return avatar;
	}
	public void setAvatar(Icon avatar) {
		if(avatar!=null)
			this.avatar = avatar;
	}
	public int getTamBorde() {
		return tamBorde;
	}
	public void setTamBorde(int tamBorde) {
		if(tamBorde>=0)
			this.tamBorde = tamBorde;
		repaint();
	}
	@Override
	protected void paintComponent(Graphics grphcs) {
		if (avatar != null) {
			int ancho = getWidth();
			int alto = getHeight();
			int diametro = Math.min(ancho, alto);
			int x = ancho / 2 - diametro / 2;
			int y = alto / 2 - diametro / 2;
			int borde = tamBorde * 2;
			diametro -= borde;
			Rectangle tam = ajustarImagen(avatar, diametro);
			BufferedImage img = new BufferedImage(tam.width, tam.height, BufferedImage.TYPE_INT_ARGB);
			Graphics2D g2_img = img.createGraphics();
			g2_img.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			g2_img.fillOval(0, 0, diametro, diametro);
			Composite composite = g2_img.getComposite();
			g2_img.setComposite(AlphaComposite.SrcIn);
			g2_img.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
			g2_img.drawImage(toImage(avatar), tam.x, tam.y, tam.width, tam.height, null);
			g2_img.setComposite(composite);
			g2_img.dispose();
			Graphics2D g2 = (Graphics2D) grphcs;
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
			if (tamBorde > 0) {
				diametro += borde;
				g2.setColor(getForeground());
				g2.fillOval(x, y, diametro, diametro);
			}
			if (isOpaque()) {
				g2.setColor(getBackground());
				diametro -= borde;
				g2.fillOval(x + tamBorde, y + tamBorde, diametro, diametro);
			}
			g2.drawImage(img, x + tamBorde, y + tamBorde, null);
		}
		super.paintComponent(grphcs);
	}
	private Rectangle ajustarImagen(Icon avatar, int tam) {
		int w = tam;
		int h = tam;
		int iw = avatar.getIconWidth();
		int ih = avatar.getIconHeight();
		double escalaX = (double) w / iw;
		double escalaY = (double) h / ih;
		double escala = Math.max(escalaX, escalaY);
		int ancho = (int) (escala * iw);
		int alto = (int) (escala * ih);
		if (ancho < 1) {
			ancho = 1;
		}
		if (alto < 1) {
			alto = 1;
		}
		int cw = tam;
		int ch =tam;
		int x = (cw - ancho) / 2;
		int y = (ch - alto) / 2;
		return new Rectangle(new Point(x, y), new Dimension(ancho, alto));
	}
	private Image toImage(Icon icono) {
		return ((ImageIcon) icono).getImage();
	}
}
Clases utilizadas (Importaciones)
import java.awt.AlphaComposite;
import java.awt.Composite;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
