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!!!
En este post crearemos una aplicación en Android Studio para conectarnos con nuestra base de datos de Firebase y leer al[...]
Cuando utilizamos aplicaciones web con conexión a base de datos MYSQL, se suele crear una clase que gestione la interacc[...]
Cuando tenemos nuestra aplicación android terminada, lo siguiente es distribuirla ya sea en el Google Play o independien[...]
iReport nos da la posibilidad de dar un formato condicional a los diferentes registros resultado de nuestras consultas S[...]
PlaceHolder: PlaceHolder es un atributo propio de HTML5 y es el texto que aparece dentro de un campo de texto (un JTextF[...]
En este post realizaremos una aplicación que pueda capturar nuestra voz y convertir en texto Pasar voz a texto con Andro[...]