只在一侧实现圆角边框的Java方法

9

我需要在组件的一侧创建一个圆角边框。

以下代码可创建圆角边框:

  new LineBorder(Color.RED, 3, true)

我看过这个帖子,它展示了如何创建一个可以在组件的一侧使用的亚光边框,但是亚光边框不是圆角的。

有可能只在一侧拥有圆角边框吗?

编辑:

我尝试使用复合边框,像这样:

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

但是它不起作用...

5个回答

6
你可以重写LineBorder方法,并在其中绘制所需内容 来自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);
    }

替换g.drawRoundRect(...)似乎并不容易,我个人认为。但这是一个开始 - 你需要分别绘制圆角和边缘。 - Thomas
@Thomas 说起来容易做起来难:P 用弧形绘制圆角对我来说有些困难。我一直在尝试,但还没有成功。 - David
@Thomas http://www.docjar.com/html/api/java/awt/Graphics.java.html 我看不懂。为什么除了drawRoundRect和fillRoundRect之外,其他所有东西的源代码都在那里???! - David
1
@David 例如 https://dev59.com/mm025IYBdhLWcg3w3J5H#5755124,+1 - mKorbel
1
@David,我没有针对你个人的意思,但是在你最后一篇帖子中,我认为你看不到整体的情况:-)。默认情况下,java.awt.Border有四个边框。我在一些主题线程中看到了关于如何从位置(NORTH/SOUTH/WEST/EAST)提取/更改/着色特定边框的讨论,http://www.java2s.com/Tutorial/Java/0240__Swing/1530__AbstractBorder.htm 和其他一些... - mKorbel
显示剩余3条评论

3
这里是如何使用Graphics2D#clipRect()的示例。 这段代码只保留了两个右侧的圆角,并在左侧有正常的边框。如上所述,您需要在自定义的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));

当我使用它来覆盖paintBorder时,该代码不会绘制圆角边框。 :( - David

3

LineBorder 只支持所有角落都是圆角或不是圆角。 复合边框(如JavaDoc所述)在外部使用一个边框,在内部使用另一个边框,因此不区分左/右或上/下。

恐怕您必须编写自己的 Border 实现,或者寻找其他人已经制作的实现(外部库)。


1
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
    }
}

0

这里有一个例子:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接