技术开发 频道

增强图形用户界面的可访问性

  与随Java平台一起交付的其他 look-and-feel设计不同,Metal look and feel并不使用GIF文件来绘制它的图标。相反,它是通过一个名为 avax.swing.plaf.metal.MetalIconFactory 的工厂类来动态地创建图标的。对于表 1 中列出的每一个键,它都提供一个相应的 getXXXIcon() 方法,用以绘制 矢量图标。

  利用一个工厂创建的矢量图标有一个好处,那就是它们可以使用当前主题所定义的颜色,而不是预定义的颜色。因为这种图标是矢量的,通常可以在不影响质量的情况下改变其大小。不幸的是,除了4个图标外,在 MetalIconFactory 中没有哪个方法会接收一个可以定义图标大小的参数。因此,定义图标大小的惟一的方法就是构建一个全新的图标工厂。

  幸运的是,对这个问题并非无计可施。您可以创建一个实现 javax.swing.Icon 接口的类,然后将一个现有的图标以及缩放比例作为参数传给这个类的构造函数,再用 java.awt.Graphics2D API绘出该图标的一个新版本,在这个新版本中,其大小已发生了变化,其格式是位图图像格式(参见清单1)。当然,这意味着当一个图标被放大时,该图标的质量会有所损失。不过,这种方法实现起来比构建一个全新的图标工厂要容易得多。而且,对于像复选框和单选按钮这样的一些简单的图标,经放大后其质量依然是可以接受的。

  清单 1. 一个图标放大器

1 /** A class to create a magnified version of an existing icon */
2 protected class MagnifiedIcon implements Icon {
3     private Icon icon ;
4     private double factor ;
5     
6     public MagnifiedIcon(Icon icon, double factor) {
7       this.icon = icon ;
8       this.factor = factor ;
9     }
10     public int getIconWidth() {
11       return (int)(icon.getIconWidth()*factor) ;}
12     public int getIconHeight() {
13       return (int)(icon.getIconHeight()*factor) ;}
14
15     public void paintIcon(Component c, Graphics g, int x, int y) {
16       Graphics2D g2d = (Graphics2D)g.create() ;
17       g2d.translate(x,y);
18       g2d.scale(factor, factor);
19       icon.paintIcon(c,g2d,0,0);
20       g2d.dispose();
21     }
22   }
23
0
相关文章