En este post crearemos un swing Label personalizado que tendrá la forma circular en su borde, con esto obtendremos un bonito efecto circular elegante y que se sale de lo común del JLabel tradicional rectangular.
IDE: Netbeans 7.x
Nivel: Intermedio
Tiempo: 15 minutos
1. Crea un nuevo proyecto Java Class Library y llamado «Circle Label», dale la siguiente estructura:
2. Para darle la forma circular al JLabel, lo que haremos sera crear nuestro propio Border que se extenderá de AbstractBorder, entonces sobreescribiremos el método paintBorder para pintar gracias a java2d una figura Ellipse2D, para rellenar las partes fuera de la forma circular, se usara el color del componente padre.
Abre la clase CircleBorder y pega el siguiente código:
package com.bolivia.label; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; import javax.swing.border.AbstractBorder; /** * @web https://www.jc-mouse.net/ * @author Mouse */ public class CircleBorder extends AbstractBorder{ private Color color; private BasicStroke stroke = null; private RenderingHints hints; /** Constructor*/ CircleBorder() { color = Color.BLACK;//negro stroke = new BasicStroke(1);//grosor del borde hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); } /** Constructor * @param Color color color de borde * @param int value grosor del borde */ CircleBorder( Color color, int value) { this.color = color; stroke = new BasicStroke(value); hints = new RenderingHints( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } @Override public void paintBorder(Component c,Graphics g,int x, int y, int width, int height) { Graphics2D g2 = (Graphics2D) g; Ellipse2D circle2D = new Ellipse2D.Double();//java2d //si el ancho de linea del borde es igual a cero if( stroke.getLineWidth()==0 ) { //dibuja el circulo en toda su extensión circle2D.setFrameFromCenter( new Point(x+width/2,y+height/2), //centro new Point( width , height) //ancho y alto ); } else { //pinta el circulo pero restando el grosor del borde circle2D.setFrameFromCenter( new Point(x+width/2,y+height/2), new Point( width-(int)stroke.getLineWidth() , height-(int) stroke.getLineWidth()) ); } Polygon pointer = new Polygon(); Area area = new Area(circle2D); area.add(new Area(pointer)); g2.setRenderingHints(hints); //pinta el fondo con el color del componente padre Component parent = c.getParent(); if (parent!=null) { Color bg = parent.getBackground(); Rectangle rect = new Rectangle(0,0,width, height); Area borderRegion = new Area(rect); borderRegion.subtract(area); g2.setClip(borderRegion); g2.setColor(bg); g2.fillRect(0, 0, width, height); g2.setClip(null); } if( stroke.getLineWidth()>0 ) { g2.setColor(color); g2.setStroke(stroke); } g2.draw(area); } }
3. La clase CircleBorder creada en el paso 2, debemos implementarla en nuestro Label CLabel.java de la siguiente manera:
package com.bolivia.label; import java.awt.Color; import java.awt.Dimension; import javax.swing.JLabel; import static javax.swing.SwingConstants.CENTER; import javax.swing.border.AbstractBorder; /** * @web htpp://www.jc-mouse.net * @author Mouse */ public class CLabel extends JLabel { private AbstractBorder circleBorder = new CircleBorder(); private int lineBorder=1; private Color lineColor= Color.BLACK; /** Constructor */ public CLabel() { Dimension d = new Dimension(100,100); setSize(d); setPreferredSize(d); setText("CLabel"); setOpaque(true); setHorizontalAlignment(CENTER); setVisible(true); setBorder(circleBorder); } //Color de borde public Color getLineColor() { return lineColor; } public void setLineColor(Color color) { circleBorder = new CircleBorder(color, lineBorder); lineColor = color; setBorder(circleBorder); } //Grosor de borde public int getLineBorder() { return lineBorder; } public void setLineBorder(int lineBorder) { circleBorder = new CircleBorder(lineColor, lineBorder); this.lineBorder = lineBorder; setBorder(circleBorder); } }
También declaramos los métodos Get/Set para LineColor de tipo Color (Color de linea del borde) y LineBorder de tipo entero (Grosor de borde), estos métodos son los que se verán en la ventana de propiedades y nos permiten cambiar el color y grosor del borde desde código
4. Para terminar, clic derecho sobre el proyecto y CLEAN AND BUILD (Limpiar y Construir) para crear el *.JAR
DESCARGAS
Proyecto Label Circular
Liberia Circle_label.jar
enjoy!!!
Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.
Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye
Enjoy! :)
En este post dejo el código fuente de un blog en PHP desarrollado siguiendo el patrón de diseño MVC (Modelo, Vista y Con...
Maria DB es un sistema de gestión de bases de datos derivado de MySQL con licencia GPL, pero con un rendimiento similar...
Las aplicaciones para celulares inteligentes con sistema operativo Android, se distribuyen en archivos *.APK, si como pr...
¿Quien no ha querido programar un juego? creo que la mayoría si no es que todos los que conocen de programación sin impo...
PlaceHolder: PlaceHolder es un atributo propio de HTML5 y es el texto que aparece dentro de un campo de texto (un JTextF...
En este tutorial veremos como usar el componente Slider de JavaFX , capturas los cambios que realice el usuario y con es...
El gigante tecnologico Google a puesto un bonito Doodle en su buscador que esta fascinando a sus millones de usuarios qu...
WhatsApp anuncio a través de su blog que ya se encuentra disponible la función de envío de fotos y videos TEMPORALES, es...
Muchas de las innovaciones computacionales de la NASA se desarrollaron para ayudar a explorar el espacio, pero ahora la...
TikTok es una plataforma de microvideos muy popular entre los jóvenes el cual cuenta ya con millones de videos cortps de...
1 comentario en “JLabel circular”
Los comentarios estan cerrados