给JComponent添加阴影
时间: 2024-05-14 14:16:19 浏览: 13
要给 JComponent 添加阴影,可以使用 Java Swing 中的 Border 类。具体实现可以使用 DropShadowBorder 类,该类继承了 LineBorder 类和 AbstractBorder 类,可以实现在 JComponent 周围添加阴影。
以下是一个简单的示例代码:
```
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.AbstractBorder;
import javax.swing.border.LineBorder;
public class ShadowBorder extends AbstractBorder {
private static final long serialVersionUID = 1L;
private final int shadWidth = 5;
private final BufferedImage shadImage = new BufferedImage(shadWidth * 2, shadWidth * 2, BufferedImage.TYPE_INT_ARGB);
public ShadowBorder() {
Graphics g = shadImage.getGraphics();
g.setColor(new Color(0, 0, 0, 100));
g.fillRoundRect(shadWidth, shadWidth, shadWidth, shadWidth, 5, 5);
}
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
g.drawImage(shadImage, x - shadWidth, y - shadWidth, null);
}
@Override
public Insets getBorderInsets(Component c) {
return new Insets(shadWidth, shadWidth, shadWidth, shadWidth);
}
@Override
public Insets getBorderInsets(Component c, Insets insets) {
insets.top = insets.left = insets.bottom = insets.right = shadWidth;
return insets;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setBorder(new ShadowBorder());
JButton button = new JButton("Hello World");
panel.add(button);
frame.setContentPane(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setVisible(true);
}
}
```
在上面的代码中,首先定义了一个 ShadowBorder 类,该类继承了 AbstractBorder 类,并实现了其中的几个方法。在构造函数中,创建了一个 BufferedImage 对象,用于存储阴影的图像。然后使用 Graphics 类在该图像上绘制了一个半透明的圆角矩形。在 paintBorder() 方法中,使用该图像绘制阴影。在 getBorderInsets() 方法中,返回了阴影的尺寸,以便正确地计算组件的边界。最后,在 main() 方法中创建了一个 JFrame,将一个带有阴影边框的 JPanel 添加到其中,再将一个 JButton 添加到该 JPanel 中。
运行该程序后,将会看到一个带有阴影边框的 JPanel,其中包含一个 JButton。