Java圆角和透明的边框

以下屏幕截图显示了TextBubbleBorder1的测试。我想使矩形外部的组件的角完全透明并显示其下方的任何组件。我找到了一种方法,可以通过ClipGraphics2D实例上设置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,我们最终得到了一个“圆角矩形”。

回答:

// Paint the BG color of the parent, everywhere outside the clip

// of the text bubble.

请参阅源代码中的这一点,该源正确显示为:

import java.awt.*;

import java.awt.image.*;

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(2,0,5,5));

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

gui.setBackground(Color.RED);

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

AbstractBorder brdrRight = new TextBubbleBorder(Color.BLACK,2,16,16,false);

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

l1.setBorder(brdrRight);

gui.add(l1);

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

l2.setBorder(brdrLeft);

l2.setBackground(Color.YELLOW);

l2.setOpaque(true);

gui.add(l2);

JPanel p1 = new JPanel();

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

p1.setBorder(brdrRight);

p1.setOpaque(false);

gui.add(p1);

JPanel p2 = new JPanel();

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

p2.setBorder(brdrLeft);

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;

private boolean left = true;

RenderingHints hints;

TextBubbleBorder(

Color color) {

this(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);

}

TextBubbleBorder(

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

this(color, thickness, radii, pointerSize);

this.left = left;

}

@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();

if (left) {

// 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);

} else {

// left point

pointer.addPoint(

width - (strokePad + radii + pointerPad),

bottomLineY);

// right point

pointer.addPoint(

width - (strokePad + radii + pointerPad + pointerSize),

bottomLineY);

// bottom point

pointer.addPoint(

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

height - strokePad);

}

Area area = new Area(bubble);

area.add(new Area(pointer));

g2.setRenderingHints(hints);

// Paint the BG color of the parent, everywhere outside the clip

// of the text bubble.

Component parent = c.getParent();

if (parent!=null) {

Color bg = parent.getBackground();

Rectangle rect = new Rectangle(0,0,width, height);

Area borderRegion = new Area(rect);

borderRegion.subtract(area);

g2.setClip(borderRegion);

g2.setColor(bg);

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

g2.setClip(null);

}

g2.setColor(color);

g2.setStroke(stroke);

g2.draw(area);

}

}

以上是 Java圆角和透明的边框 的全部内容, 来源链接: utcz.com/qa/433881.html

回到顶部