swing 圆角按钮_Java Swing - 如何创建自定义3D圆角

这篇博客介绍了如何使用Java Swing创建具有3D效果和圆角的自定义边框。通过`ThreeDimensionalBorder`类,实现了颜色、厚度、半径等参数可定制的圆角按钮效果,利用Graphics2D进行绘制并添加阴影,增强了视觉体验。
摘要由CSDN通过智能技术生成

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Component;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Insets;

import java.awt.Rectangle;

import java.awt.RenderingHints;

import java.awt.geom.Area;

import java.awt.geom.RoundRectangle2D;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.border.AbstractBorder;

public class Main {

public static void main(String[] args) {

JLabel l = new JLabel("Text");

l.setBorder(new ThreeDimensionalBorder(Color.BLACK, 200, 5));

JOptionPane.showMessageDialog(null, l);

}

}

class ThreeDimensionalBorder extends AbstractBorder {

Color color;

int thickness = 8;

int radius = 8;

Insets insets = null;

BasicStroke stroke = null;

int strokePad;

RenderingHints hints;

int shadowPad = 3;

ThreeDimensionalBorder(Color color) {

this(color, 128, 8);

}

ThreeDimensionalBorder(Color color, int transparency, int shadowWidth) {

this.color = color;

shadowPad = shadowWidth;

stroke = new BasicStroke(thickness);

strokePad = thickness / 2;

hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

int pad = radius + strokePad;

int bottomPad = pad + strokePad + shadowPad;

int rightPad = pad + strokePad + shadowPad;

insets = new Insets(pad, pad, bottomPad + shadowPad, rightPad);

}

@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 - shadowPad;

RoundRectangle2D.Double bubble = new RoundRectangle2D.Double(0 + strokePad,

0 + strokePad, width - thickness - shadowPad, bottomLineY, radius, radius);

Area area = new Area(bubble);

g2.setRenderingHints(hints);

g2.setColor(color);

g2.setStroke(stroke);

g2.draw(area);

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

shadowArea.subtract(area);

g.setClip(shadowArea);

Color shadow = new Color(color.getRed(), color.getGreen(), color.getBlue(),

128);

g2.setColor(shadow);

g2.translate(shadowPad, shadowPad);

g2.draw(area);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值