Icon
先说说简单的内容,如何在一个JButton或者JMenuItem中显示一个图标:
JButton或者JMenuItem这样支持Icon的控件通常都有一个这样的构造方法,以JMenuItem为例:
只需要使用这个构造方法即可,但是如何获得一个Icon对象呢?
要想获得一个Icon首先必须有一个图像文件,并且放在一个特定的位置,这个位置通常于Java类同目录或者在其下的子目录中(要求运行时环境,例如classes目录或者jar文件中相同的位置也由这些图像文件)。
以EBookMgr为例,代码斗方在ebookmgr目录中,图像文件放在子目录ebookmgr.images目录中,那么得到Icon共有两步:
第一步:
第二步:
之后就可以使用前面提到的构造方法了。注意在生成imageUrl的过程中使用的是构造Icon的类和图像文件之间的相对路径(也就是说是:images/menu/setting.png而不是ebookmgr/images/menu/setting.png)。
i18n
现在说一说稍微复杂一些的i18n,i18n的主要思想是:将所有文本标签按照语言分成套,放在不同的文件中(我们在这里以属性文件为例)在用一种动态的方法访问这些文件,动态的含义是能够根据程序运行的地域、语言来自动从对应的文件种取得需要的文本标签。
“将所有文本标签按照语言分成套”的含义是:
定义一系列命名为 basename_LanguageCode_CountryCode.properties的文件,这些文件通常也放在特定的目录中(通常是resources子目录)。
这里我们在ebookmgr.resources目录中定义了如下文件:
ui.properties 默认的属性文件,对应的地域无法匹配到特定的属性文件时使用这个文件(例如波多黎各语)
ui_en_US.properties 英文美国
ui_zh_CN.properties 中文中国
ui_ja_JP.properties 日语日本
“动态的方法”来源于java.util.ResourceBundle类的支持。
这里注意两个地方,第一是使用的跟资源名:ebookmgr.resources.ui,第二是Locale.getDefault()获得了运行当前软件的地域。所以此时的res表示的就是特定语言版本的内容。(可以传入指定的参数来改变默认的地域,这就是在中文平台下使用英文,或者日文主题的实现原理)
之后就可以使用getString(String key)方法获得对应的字符串了。
顺便说一下properteis文件中保存非ASCII字符时会被自动转义,参看以下截图: