每个Swing 组件的绘制 都是通过paintComponent( ) 方法来实现的,通过重写该方法可以实现许多有趣的特效。模糊特效的实现是在象素级别进行操作的。是逐象素进行模糊的。先将你欲模糊的图片转化为内存中的位图表示,然后模糊每个象素。下面的BufferedImage 即是将图片存储为一个内存块,每个象素占3字节(四字节每象素表示里有一个字节表示alpha通道——就是灰度级 ;其余三字节,每字节表示红 绿 蓝 即RGB),模糊特效不需要alpha通道。java2D提供了许多对象素级处理图象的方法如下面的ConvolveOp 它需要一个Kernel 对象作为参数,Kernel对象的构造需要提供一个3*3矩阵,该矩阵将会作用到每个象素上,相关矩阵的意义可在任何一本计算机图形学书籍上找到。
package swingTest;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.awt.event.*;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
public class BlurJButton extends JButton {
public BlurJButton() {
// TODO Auto-generated constructor stub
}
public BlurJButton(Icon arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public BlurJButton(String arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public BlurJButton(Action arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public BlurJButton(String arg0, Icon arg1) {
super(arg0, arg1);
// TODO Auto-generated constructor stub
}
public void paintComponent(Graphics g) {
if(isEnabled()) {
super.paintComponent(g);
return;
}
BufferedImage buf = new BufferedImage(getWidth(),getHeight(),
BufferedImage.TYPE_INT_RGB);
super.paintComponent(buf.getGraphics());
// Blur the buffered image (see next section)
float[] my_kernel = {
0.10f, 0.10f, 0.10f,
0.10f, 0.20f, 0.10f,
0.10f, 0.10f, 0.10f };
ConvolveOp op = new ConvolveOp(new Kernel(3,3, my_kernel));
Image img = op.filter(buf,null);
g.drawImage(img,0,0,null);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame = new JFrame("Blurred Button Hack");
final JButton button = new BlurJButton("A Blurred Button");
JButton control = new JButton("Switch");
control.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
button.setEnabled(!button.isEnabled());
}
});
frame.getContentPane().add(button);
frame.getContentPane().add("South",control);
frame.pack();
frame.setVisible(true);
}
}