2011-08-12 55 views
9

Necesito crear un borde redondeado en un lado de un solo componente.Borde redondeado en un solo lado java

Este código crea un borde redondeado:

new LineBorder(Color.RED, 3, true) 

he visto this thread que muestra cómo crear un borde mate que se puede utilizar en un lado de tan sólo un componente, sin embargo un borde mate no es redondeado.

¿Es posible tener un borde redondeado en un solo lado?

Editar:

He intentado usar frontera compuesto de la siguiente manera:

cell.setBorder(BorderFactory.createCompoundBorder(
     new LineBorder(borderColor, 3, true), 
     BorderFactory.createMatteBorder(0, 3, 0, 0, Color.black))); 

Pero esto no funciona ...

Respuesta

3

LineBorder sólo es compatible con todas las esquinas redondeadas o no. Un borde compuesto (como los estados de JavaDoc) utiliza un borde para el exterior y otro para el interior y por lo tanto no distingue entre izquierda/derecha o superior/inferior.

Me temo que tendrá que escribir su propia implementación Border o buscar una que ya haya sido creada por otra persona (biblioteca externa).

6

se puede anular el método de LineBorder y sacar todo lo que necesita no de fuentes de LineBorder

public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
     Color oldColor = g.getColor(); 
     int i; 

    /// PENDING(klobad) How/should do we support Roundtangles? 
     g.setColor(lineColor); 
     for(i = 0; i < thickness; i++) { 
     if(!roundedCorners) 
       g.drawRect(x+i, y+i, width-i-i-1, height-i-i-1); 
     else 
SET CLIP HERE TO DRAW ONLY NECESSARY PART 
       g.drawRoundRect(x+i, y+i, width-i-i-1, height-i-i-1, thickness, thickness); 
     } 
     g.setColor(oldColor); 
    } 
+0

relacing 'g.drawRoundRect (...)' no parece trivial, la OMI. Pero es un comienzo: tendrías que dibujar las esquinas redondeadas y los bordes por separado. – Thomas

+0

@Thomas Más fácil decirlo que hacerlo: P Me falta dibujar las esquinas redondeadas con arcos. Lo he estado intentando pero aún no lo logro. – David

+0

Ahora todo lo que necesitamos es el código fuente de drawRoundRect ... – David

3

Aquí hay un ejemplo de cómo usar Graphics2D#clipRect(). Este código solo conserva las dos esquinas redondeadas a la derecha y tiene bordes normales a la izquierda. Como se mencionó anteriormente, tendrá que usar este código dentro de su LineBorder personalizado.

Graphics2D g2d = (Graphics2D) g; 

g2d.clipRect(150, 10, 100, 100); 
g2d.draw(new RoundRectangle2D.Double(100, 10, 80, 30, 15, 15)); 

g2d.setClip(null); 
g2d.clipRect(100, 10, 50, 100); 
g2d.draw(new Rectangle2D.Double(100, 10, 80, 30)); 
+0

Ese código no dibuja un borde redondeado cuando lo uso para reemplazar paintBorder. :( – David

0

Aquí es un ejemplo,

JPanel content = new JPanel(); content.setBorder(BorderFactory.createEmptyBorder(1,30,1,1));

0
public static final int TOP_LEFT = 1; 
public static final int TOP_RIGHT = 2; 
public static final int BOTTOM_LEFT = 4; 
public static final int BOTTOM_RIGHT = 8; 
public static final int ALL_CORNERS = TOP_LEFT + TOP_RIGHT + BOTTOM_LEFT + BOTTOM_RIGHT; 

public static void drawRoundRect(Graphics g, Color fillColor, Color borderColor, int x, int y, int width, int height, int radius, int cornerMask) 
{ 
    // // XXX Old code (without selectively disabled round corners): 
    // if (fillColor != null) 
    // { 
    // og.setColor(fillColor); 
    // og.fillRoundRect(x, y, width - 1, height - 1, radius, radius); 
    // } 
    // if (borderColor != null && !borderColor.equals(fillColor)) 
    // { 
    // og.setColor(borderColor); 
    // og.drawRoundRect(x, y, width - 1, height - 1, radius, radius); 
    // } 
    radius += radius % 2; // so we don't have to deal with rounding issues for odd numbers 
    int radiusHalf = radius/2; 
    width--; 
    height--; 
    if (fillColor != null) 
    { 
     g.setColor(fillColor); 
     // og.fillRoundRect(x, y, width - 1, height - 1, radius, radius); 
     if ((cornerMask & TOP_LEFT) > 0) 
     { 
      g.fillArc(x, y, radius, radius, 90, 90); 
     } 
     else 
     { 
      g.fillRect(x, y, radiusHalf, radiusHalf); 
     } 
     if ((cornerMask & TOP_RIGHT) > 0) 
     { 
      g.fillArc(x + width - radius, y, radius, radius, 0, 90); 
     } 
     else 
     { 
      g.fillRect(x + width - radiusHalf, y, radiusHalf, radiusHalf); 
     } 
     if ((cornerMask & BOTTOM_RIGHT) > 0) 
     { 
      g.fillArc(x + width - radius, y + height - radius, radius, radius, 270, 90); 
     } 
     else 
     { 
      g.fillRect(x + width - radiusHalf, y + height - radiusHalf, radiusHalf, radiusHalf); 
     } 
     if ((cornerMask & BOTTOM_LEFT) > 0) 
     { 
      g.fillArc(x, y + height - radius, radius, radius, 180, 90); 
     } 
     else 
     { 
      g.fillRect(x, y + height - radiusHalf, radiusHalf, radiusHalf); 
     } 

     g.fillRect(x + radiusHalf, y, width - radius, radiusHalf); 
     g.fillRect(x + radiusHalf, y + height - radiusHalf, width - radius, radiusHalf); 
     g.fillRect(x, y + radiusHalf, radiusHalf, height - radius); 
     g.fillRect(x + width - radiusHalf, y + radiusHalf, radiusHalf, height - radius); 
     g.fillRect(x + radiusHalf, y + radiusHalf, width - radius, height - radius); 
    } 
    if (borderColor != null && !borderColor.equals(fillColor)) 
    { 
     g.setColor(borderColor); 

     // XXX: there are problems with this when using semi-transparent colors + borderSize > 1 
     // XXX: this could be changed to to use ONE draw action using drawShape with GeneralPath.curveTo() 
     // XXX: this then could also be used to FILL the shape (see above) 
     if ((cornerMask & TOP_LEFT) > 0) 
     { 
      g.drawArc(x, y, radius, radius, 90, 90); 
     } 
     else 
     { 
      g.drawLine(x, y, x + radiusHalf, y); 
      g.drawLine(x, y, x, y + radiusHalf); 
     } 
     if ((cornerMask & TOP_RIGHT) > 0) 
     { 
      g.drawArc(x + width - radius, y, radius, radius, 0, 90); 
     } 
     else 
     { 
      g.drawLine(x + width - radiusHalf, y, x + width, y); 
      g.drawLine(x + width, y, x + width, y + radiusHalf); 
     } 
     if ((cornerMask & BOTTOM_RIGHT) > 0) 
     { 
      g.drawArc(x + width - radius, y + height - radius, radius, radius, 270, 90); 
     } 
     else 
     { 
      g.drawLine(x + width - radiusHalf, y + height, x + width, y + height); 
      g.drawLine(x + width, y + height - radiusHalf, x + width, y + height); 
     } 
     if ((cornerMask & BOTTOM_LEFT) > 0) 
     { 
      g.drawArc(x, y + height - radius, radius, radius, 180, 90); 
     } 
     else 
     { 
      g.drawLine(x, y + height, x + radiusHalf, y + height); 
      g.drawLine(x, y + height - radiusHalf, x, y + height); 
     } 

     g.drawLine(x + radiusHalf, y, x + width - radiusHalf, y); // top 
     g.drawLine(x + width, y + radiusHalf, x + width, y + height - radiusHalf); // right 
     g.drawLine(x + radiusHalf, y + height, x + width - radiusHalf, y + height); // bottom 
     g.drawLine(x, y + radiusHalf, x, y + height - radiusHalf); // left 
    } 
} 
Cuestiones relacionadas