在Java中,Gradient color 有LinearGradientPaint 和 RadialGradientPaint可以直接使用,但是现在如果要
在这个黑色区域画出渐变颜色,比如颜色就是从里面的圆角矩形边框以黑色开始渐变到外面的圆角矩形边框到白色。求高手解答!!!
在这个黑色区域画出渐变颜色,比如颜色就是从里面的圆角矩形边框以黑色开始渐变到外面的圆角矩形边框到白色。求高手解答!!!
解决方案 »
- 【不仅仅是散分】
- 很简单的问题
- 有没有人帮我看一下这道题怎么些
- 请教:这个类为什么不可以序列化
- 高分求解:怎样实现在listener中,当contextDestroyed的时候同时销毁所有的session而不用等它们timeout?
- 我在panel上绘的乐谱图,如果窗体被快速拖动,图形就会消失,如何解决?
- 请问:在jb7里怎样配置才能访问oracle数据库?
- 请问如何调用windows自带的程序(比如说计算器),我是新手请详细指点,愿(200)分相送。
- 在jbuilder中如何将.java的文件生成.class的文件
- 通过 java jtree 构建一棵与表结构一致的树?
- Java 设置背景图片 的问题
- 如何学习JAVA容器?
重写绘图的方法应该可以实现。
不过感觉挺麻烦的,直接弄一个现成的图片(ps生成)贴上多省事。
这个没做过
可以查看一下:
Stroke 接口的 Shape createStrokedShape(Shape s) 方法
Graphics2D 的clipe(Shape s) 方法然后参考用 GradientPaint 实现
试了一下,可以为“透明”控件加“投影”的border
import java.awt.AlphaComposite;
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.geom.Area;
import java.awt.image.BufferedImage;
import javax.swing.border.Border;/**
*
* @date 08/11/2012
*/
public class ShadowBorder implements Border {
private static final Color SHADOW_COLOR = Color.BLACK;
private static final float SHADOW_ALPHA = 0.5f;
private int size;
public ShadowBorder(int size) {
if( size < 0 )
throw new IllegalArgumentException();
this.size = size;
}
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
int widthFix = width - (size * 2);
int heightFix = height - (size * 2);
BufferedImage shadow = new BufferedImage(
size * 2 + width,
size * 2 + height,
BufferedImage.TYPE_INT_ARGB);
Graphics2D imgGraphics = shadow.createGraphics();
imgGraphics.setColor(SHADOW_COLOR);
imgGraphics.fillRect(size, size, widthFix, heightFix);
imgGraphics.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_IN, SHADOW_ALPHA));
imgGraphics.fillRect(0, 0, shadow.getWidth(), shadow.getHeight());
imgGraphics.dispose();
GaussianFilter filter = new GaussianFilter(size * 2);
shadow = filter.filter(shadow, null);
Area shadowArea = new Area(new Rectangle(0, 0, width, height));
shadowArea.subtract(new Area(new Rectangle(0, 0, widthFix, heightFix)));
@SuppressWarnings("unchecked")
Graphics2D gg = (Graphics2D)g.create();
gg.setClip(shadowArea);
gg.drawImage(shadow, 0, 0, c);
gg.dispose();
} @Override
public Insets getBorderInsets(Component c) {
return new Insets(0, 0, size * 2, size * 2);
} @Override
public boolean isBorderOpaque() {
return false;
}
}
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;/**
*
* @date 08/11/2012
*/
public class TestShadowBorder extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() { @Override
public void run() {
JFrame f = new JFrame("Test Shadow Border");
f.getContentPane().add(new TestShadowBorder(), BorderLayout.CENTER);
f.pack();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
TestShadowBorder() {
super(new FlowLayout(FlowLayout.CENTER, 20, 20));
JPanel inner = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
Insets in = getInsets();
@SuppressWarnings("unchecked")
Graphics2D gg = (Graphics2D)g.create();
gg.setBackground(getBackground());
gg.clearRect(in.left, in.top, getWidth()-in.left-in.right, getHeight()-in.top-in.bottom);
}
};
inner.setOpaque(false); // hack
inner.setBackground(Color.GREEN.darker());
inner.setBorder(BorderFactory.createCompoundBorder(
new ShadowBorder(3),
BorderFactory.createLineBorder(inner.getBackground().darker())
));
inner.setPreferredSize(new Dimension(300, 200));
add(inner);
}
}
谢谢!! 你的 答复很好的实现了模糊效果在边框上应用。呵呵。但是还是回到Java绘制渐变颜色的问题上,在 gradient paint上,Java只提供了LinearGradientPaint和RadialGradientPaint,我们现在想实现一个比如EllipseGradientPaint或者RectangleGradientPaint又该如何实现呢?谢谢讨论 Thanks
正常状态:获得焦点状态:被按下状态:被释放状态:
由于每帖的字数限制,代码发到了CSDN博客上。大家有兴趣可以去看看,如果能发表下修改意见那将非常高兴。