2011-08-12 36 views
9

Tôi cần phải tạo đường viền tròn trên một bên chỉ một thành phần.Đường viền Tròn ở một bên chỉ java

Mã này tạo ra một biên giới tròn:

new LineBorder(Color.RED, 3, true) 

Tôi đã thấy this thread trong đó cho thấy bạn làm thế nào để tạo ra một biên giới mờ có thể được sử dụng trên một mặt của chỉ một thành phần, tuy nhiên viền mờ không phải là làm tròn.

Có thể chỉ có đường viền tròn ở một bên không?

Edit:

Tôi đã cố gắng sử dụng biên giới hợp chất như thế này:

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

Nhưng nó không hoạt động ...

Trả lời

3

LineBorder chỉ hỗ trợ tất cả các góc được làm tròn hay không. Một biên giới hợp chất (như các trạng thái JavaDoc) sử dụng một biên giới cho bên ngoài và một cho bên trong và do đó không phân biệt giữa trái/phải hoặc trên/dưới.

Tôi e rằng bạn sẽ phải tự viết Border triển khai của riêng bạn hoặc tìm một bản đã được tạo bởi người khác (thư viện bên ngoài).

6

Bạn có thể ghi đè lên các phương pháp LineBorder và vẽ tất cả các bạn cần có Từ nguồn 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 (...) 'dường như không tầm thường, IMO. Nhưng đó là một sự khởi đầu - bạn phải vẽ các góc tròn và các cạnh riêng biệt. – Thomas

+0

@Thomas Dễ nói hơn làm: P Đó là ngoài tôi để vẽ các góc tròn với vòng cung. Tôi đã cố gắng nhưng chưa quản lý được. – David

+0

Bây giờ tất cả chúng ta cần là mã nguồn của drawRoundRect ... – David

3

Dưới đây là một ví dụ về cách sử dụng Graphics2D#clipRect(). Mã này chỉ giữ hai góc tròn phải và có đường viền bình thường ở bên trái. Như đã đề cập ở trên, bạn sẽ phải sử dụng mã này bên trong tùy chỉnh LineBorder.

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

Mã đó không vẽ đường viền tròn khi tôi sử dụng nó để ghi đè paintBorder. :( – David

0

Dưới đây là một ví dụ,

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 
    } 
} 
Các vấn đề liên quan