java 圆角组件_Java圆角和透明的边框

以下屏幕截图显示了TextBubbleBorder1的测试。我想使矩形外部的组件的角完全透明并显示其下方的任何组件。我找到了一种方法,可以通过Clip在Graphics2D实例上设置a (代表圆角之外的区域)并调用来将标签的BG颜色限制在“边界内” clearRect()。可以在中看到Label 1。

但是,当父面板上有红色BG(或任何非标准颜色)时,你会看到此方法的缺点。角默认为默认面板颜色(最容易在中看到Panel 2)。

最终,我希望它能在父容器中用于非标准颜色,但是它的部分灵感来自于我需要做些什么来用渐变涂料复制该组件?

有人知道使这些角落透明的方法吗?

import java.awt.*;

import java.awt.geom.*;

import javax.swing.*;

import javax.swing.border.*;

public class BorderTest {

public static void main(String[] args) {

Runnable r = new Runnable() {

@Override

public void run() {

JPanel gui = new JPanel(new GridLayout(1,0,5,5));

gui.setBorder(new EmptyBorder(10,10,10,10));

gui.setBackground(Color.RED);

AbstractBorder brdr = new TextBubbleBorder(Color.BLACK,2,16,0);

JLabel l1 = new JLabel("Label 1");

l1.setBorder(brdr);

gui.add(l1);

JLabel l2 = new JLabel("Label 2");

l2.setBorder(brdr);

l2.setBackground(Color.YELLOW);

l2.setOpaque(true);

gui.add(l2);

JPanel p1 = new JPanel();

p1.add(new JLabel("Panel 1"));

p1.setBorder(brdr);

p1.setOpaque(false);

gui.add(p1);

JPanel p2 = new JPanel();

p2.add(new JLabel("Panel 2"));

p2.setBorder(brdr);

gui.add(p2);

JOptionPane.showMessageDialog(null, gui);

}

};

// Swing GUIs should be created and updated on the EDT

// http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

SwingUtilities.invokeLater(r);

}

}

class TextBubbleBorder extends AbstractBorder {

private Color color;

private int thickness = 4;

private int radii = 8;

private int pointerSize = 7;

private Insets insets = null;

private BasicStroke stroke = null;

private int strokePad;

private int pointerPad = 4;

RenderingHints hints;

TextBubbleBorder(

Color color) {

new TextBubbleBorder(color, 4, 8, 7);

}

TextBubbleBorder(

Color color, int thickness, int radii, int pointerSize) {

this.thickness = thickness;

this.radii = radii;

this.pointerSize = pointerSize;

this.color = color;

stroke = new BasicStroke(thickness);

strokePad = thickness / 2;

hints = new RenderingHints(

RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

int pad = radii + strokePad;

int bottomPad = pad + pointerSize + strokePad;

insets = new Insets(pad, pad, bottomPad, pad);

}

@Override

public Insets getBorderInsets(Component c) {

return insets;

}

@Override

public Insets getBorderInsets(Component c, Insets insets) {

return getBorderInsets(c);

}

@Override

public void paintBorder(

Component c,

Graphics g,

int x, int y,

int width, int height) {

Graphics2D g2 = (Graphics2D) g;

int bottomLineY = height - thickness - pointerSize;

RoundRectangle2D.Double bubble = new RoundRectangle2D.Double(

0 + strokePad,

0 + strokePad,

width - thickness,

bottomLineY,

radii,

radii);

Polygon pointer = new Polygon();

// left point

pointer.addPoint(

strokePad + radii + pointerPad,

bottomLineY);

// right point

pointer.addPoint(

strokePad + radii + pointerPad + pointerSize,

bottomLineY);

// bottom point

pointer.addPoint(

strokePad + radii + pointerPad + (pointerSize / 2),

height - strokePad);

Area area = new Area(bubble);

area.add(new Area(pointer));

g2.setRenderingHints(hints);

Area spareSpace = new Area(new Rectangle(0, 0, width, height));

spareSpace.subtract(area);

g2.setClip(spareSpace);

g2.clearRect(0, 0, width, height);

g2.setClip(null);

g2.setColor(color);

g2.setStroke(stroke);

g2.draw(area);

}

}

尽管sTextBubbleBorder是为带有背景图像的JTextArea的内部填充而设计的(JLabel由于上述原因,由于文本区域是一团糟,所以最终使用了a ),但通过指定a pointerSize为0,我们最终得到了一个“圆角矩形”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值