我只需要在组件的单侧上创建一个圆角边框。
此代码创建一个圆角边框:
new LineBorder(Color.RED, 3, true)
我看过this thread,它向您展示了如何创建可以仅在组件的一侧使用的遮罩边框,但是遮罩边框不会被舍入。
是否可以仅在一侧设置圆形边框?
修改
我尝试过使用复合边框:
cell.setBorder(BorderFactory.createCompoundBorder(
new LineBorder(borderColor, 3, true),
BorderFactory.createMatteBorder(0, 3, 0, 0, Color.black)));
但它不起作用......
答案 0 :(得分: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);
}
答案 1 :(得分:3)
LineBorder
仅支持圆角或不圆角。复合边框(如JavaDoc所述)使用一个边框用于外部,一个边框用于内部,因此不区分左/右或上/下。
我担心您要么编写自己的Border
实现,要么寻找已经由其他人(外部库)创建的实现。
答案 2 :(得分: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));
答案 3 :(得分: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
}
}
答案 4 :(得分:0)
这是一个例子,
JPanel content = new JPanel();
content.setBorder(BorderFactory.createEmptyBorder(1,30,1,1));