在某些情况下,可能还需要修改look and feel所使用的一些图标和图形资源。例如,您可能想修改复选框和单选按钮所使用的图标以便绘出它们的状态,或者使用其他的图标来绘制文件夹和树组件的节点。
例如,如果您希望某个look and feel带有大号字体,那么就需要修改图标。复选框和单选按钮所使用的图标的尺寸应该与它们的字体相适应。如果弱视用户不能辨认某个选框是否被选中,那么即使是带有大字体的复选框对他(她)来说也是毫无用处的,因为其图标的尺寸没有改变。
图3 显示了一个高对比度、大字体的但是图标的尺寸没有改变的主题的例子。您可以看到字体大小和图标尺寸之间的不协调。
图 3. 一个高对比度、大字体但是没有调整图标尺寸的主题
不幸的是,在一个主题中图标是不能修改的。因此,如果我们想重载Metal look and feel中使用的图标,我们就必须使用其他的技术。
Metal look and feel将一系列要使用的图形化资源(颜色、字体和图像)存放在一个 javax.swing.UIDefaults 对象中,这个对象基本上就是一种hash表。不同窗口小部件所需的每个图像都被该look and feel以特定的键(key)存放在这个表中,以便于检索。这同时也意味着如果您知道某一特定图像是存放在哪个键之下的,那么您就可以通过将另一个图像存放在同一个键下来替换那个图像。
让我们看看Metal look and feel如何初始化包含了图形化资源的这个表。
当look and feel被创建时,它首先实例化一个空的 UIDefaults 对象,这个对象可以通过以下方法来填充内容:
initClassDefaults(UIDefaults)
initComponentDefaults(UIDefaults)
initSystemColorDefaults(UIDefaults)
这些方法中每一个方法都是由该look and feel本身连续地调用的。这些方法连续地将图形化资源(不管是颜色、字体还是图像)存入 UIDefaults 表中惟一的键之下。
要了解更多细节,参见 javax.swing.plaf.MetalLookAndFeel 类的API 文档(参见 参考资料)。图像的初始化是在 initComponentDefaults(UIDefaults )中进行的。通过重载这个方法,您可以替换在look and feel中用到的任何标准图像。
不幸的是,存放图标时所参考的键没有相应的文档,但是 javax.swing.plaf.MetalLookAndFeel 类的源代码可以提供这些信息。表 1显示了用于引用Metal look and feel中图标的现有键的列表:
表 1. 用于引用Metal look and feel中图标的键CheckBox.iconInternalFrame . closeIconRadioButton.iconInternalFrame.maximizeIconInternalFrame.iconInternalFrame.iconifyIconInternalFrame.iconifyIconInternalFrame.minimizeIconFileView.directoryIconMenu.checkIconFileView.fileIconMenu.arrowIconFileView.computerIconMenuItem.checkIconFileView.hardDriveIconMenuItem.arrowIconFileView.floppyDriveIconCheckBoxMenuItem.checkIconFileChooser.detailsViewIconCheckBoxMenuItem.arrowIconFileChooser.homeFolderIconRadioButtonMenuItem.checkIconFileChooser.listViewIconRadioButtonMenuItem.arrowIconFileChooser.newFolderIconTree.openIconFileChooser.upFolderIconTree.closedIconSlider.horizontalThumbIconTree.leafIconSlider.verticalThumbIconTree.expandedIconInternalFrame.iconTree.collapsedIconInternalFrame.paletteCloseIcon