1、有动态效果的图像按钮
核心代码就是设置按钮在按下、滑过等动作时的图像。
button.setPressedIcon(new ImageIcon("images/button-down.png"));
button.setRolloverIcon(new ImageIcon("images/button-over.png"));
button.setSelectedIcon(new ImageIcon("images/button-sel.png"));
button.setRolloverSelectedIcon(new ImageIcon("images/button-sel-over.png"));
button.setDisabledIcon(new ImageIcon("images/button-disabled.png"));
button.setDisabledSelectedIcon(new ImageIcon("images/button-disabled-selected.png"));
2、有下拉阴影、轮廓线和3D文本修饰的JLabel
重写paintComponent方法,把一个个的字重新进行绘制。
public void paintComponent(Graphics g) {
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
char[] chars = getText().toCharArray();
FontMetrics fm = this.getFontMetrics(getFont());
int h = fm.getAscent();
LineMetrics lm = fm.getLineMetrics(getText(),g);
g.setFont(getFont());
int x = 0;
for(int i=0; i<chars.length; i++) {
char ch = chars[i];
int w = fm.charWidth(ch) + tracking;
g.setColor(left_color); //左边阴影效果的颜色
g.drawString(""+chars[i],x-left_x,h-left_y);
g.setColor(right_color);//右边阴影效果的颜色
g.drawString(""+chars[i],x+right_x,h+right_y);
g.setColor(getForeground()); //主体颜色
g.drawString(""+chars[i],x,h);
x+=w;
}
}
如果要绘制出3D的效果,那么诀窍在设置两个阴影字体的绘制位置上。
label.setLeftShadow(5,5,Color.white);//left_x,left_y,left_color
label.setRightShadow(-3,-3, new Color(0xccccff)); //right_x,right_y,right_color
label.setForeground(new Color(0x8888ff));
label.setFont(label.getFont().deriveFont(140f));
3、图片填充边框
JPanel.setBorder(Border border);
Border是一个接口,自己实现paintBorder等方法。
4、定制日历组件
重写JPanle.paintComponent方法,先把年月等信息绘制出来。
然后 一个一个单元格(日期)的绘制日期信息,如果是当前日期,则用高亮显示的背景图案。
for(int week = 0; week < 6; week++) {
for(int d = 0; d < 7; d++) {
Image img = day_img;
Color col = Color.black;
// only draw if it's actually in this month
if(cal.get(Calendar.MONTH) == today.get(Calendar.MONTH)) {
if(cal.equals(today)) { img = highlight; col = Color.white; }
g.drawImage(img,d*30+46,week*29+81,null);
g.drawString(day.format(cal.getTime()),d*30+46+4,week*29+81+20);
}
cal.add(Calendar.DATE,+1);
}
}
我打算修改这个日历组件,使它可以选择日期,就像C#日历控件一样。
5、为JTextField增加背景图像
为 JTextFiled子类准备TexturePaint实例,重写paintComponent方法。
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(texture); //texture是一个TexturePaint实例
g.fillRect(0,0,getWidth(),getHeight());
super.paintComponent(g);
}
6、在滚动窗格中引入水印
方法和5类似
7、向文本域背景添加NASA照片
启动一个进程去网站上抓取图片,这个进程每2个小时启动一次,其他时间休眠。因为网站的图片链接url可能发生变化,所以需要不断进行更新。抓取网页的html代码,利用正则表达式匹配,得到img标签的值。增加背景图案的方法类似6,只是传入的不再是图片的物理路径地址,而是一个url地址。
8、动态切换分页
这是今天看到最为震撼的效果,swing居然有这样的功能。
9、对失效组件添加模糊效果
public void paintComponent(Graphics g) {
if(isEnabled()) { //没有失效时,不用做任何特殊处理
super.paintComponent(g);
return;
}
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)); //此类实现从源到目标的卷积,这种运算使得直接邻域可 按核数学指定的方式影响输出像素。
BufferedImage buf = new BufferedImage(getWidth(),getHeight(),
BufferedImage.TYPE_INT_RGB);
super.paintComponent(buf.getGraphics());
Image img = op.filter(buf,null);
g.drawImage(img,0,0,null);
}
10、构建下拉菜单按钮
11、创建带下拉阴影的菜单
12、为菜单添加透明效果
这三个特性我都没什么兴趣,一扫而过。