这些Java教程是针对JDK 8编写的。本页面描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的概述,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息,请参阅JDK发行说明。
默认情况下,当文本包含数字时,这些数字使用拉丁(欧洲)数字显示。如果希望使用其他Unicode数字形状,则可以使用java.awt.font.NumericShaper
类。 NumericShaper
API使您能够以任何Unicode数字形状显示以ASCII值表示的数字值。
以下代码片段来自ArabicDigits
示例,展示了如何使用NumericShaper
实例将拉丁数字转换为阿拉伯数字。确定形状动作的行已用粗体标出。
ArabicDigitsPanel(String fontname) { HashMap map = new HashMap(); Font font = new Font(fontname, Font.PLAIN, 60); map.put(TextAttribute.FONT, font); map.put(TextAttribute.NUMERIC_SHAPING, NumericShaper.getShaper(NumericShaper.ARABIC)); FontRenderContext frc = new FontRenderContext(null, false, false); layout = new TextLayout(text, map, frc); } // ... public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; layout.draw(g2d, 10, 50); }
阿拉伯数字的NumericShaper
实例被获取并放置在HashMap
中作为TextLayout.NUMERIC_SHAPING
属性键。哈希映射被传递给TextLayout
实例。在paint
方法中呈现文本后,数字将以所需的脚本显示。在此示例中,拉丁数字0到9以阿拉伯数字的形式绘制。
上一个示例使用NumericShaper.ARABIC
常量来检索所需的形状器,但NumericShaper
类为许多语言提供了常量。这些常量被定义为位掩码,并称为NumericShaper
位掩码常量。
指定特定数字集的另一种方法是使用NumericShaper.Range
枚举类型。该枚举在Java SE 7版本中引入,也提供了一组常量。尽管这些常量使用不同的机制定义,但NumericShaper.ARABIC
位掩码在功能上等同于NumericShaper.Range.ARABIC
枚举,并且每个常量类型都有相应的getShaper
方法:
示例ArabicDigitsEnum
与ArabicDigits
示例相同,只是它使用NumericShaper.Range
枚举来指定语言脚本:
ArabicDigitsEnumPanel(String fontname) { HashMap map = new HashMap(); Font font = new Font(fontname, Font.PLAIN, 60); map.put(TextAttribute.FONT, font); map.put(TextAttribute.NUMERIC_SHAPING, NumericShaper.getShaper(NumericShaper.Range.ARABIC)); FontRenderContext frc = new FontRenderContext(null, false, false); layout = new TextLayout(text, map, frc); }
两个getShaper
方法都接受singleRange
参数。对于任何一个常量类型,都可以指定一段特定语言的脚本。基于位掩码的常量可以使用OR
操作符进行组合,或者您可以创建一组NumericShaper.Range
枚举。以下示例演示如何使用每个常量类型定义一个范围:
NumericShaper.MONGOLIAN | NumericShaper.THAI | NumericShaper.TIBETAN EnumSet.of( NumericShaper.Range.MONGOLIAN, NumericShaper.Range.THAI, NumericShaper.Range.TIBETAN)
您可以使用getRanges
方法(基于位掩码的shaper)或getRangeSet
方法(基于枚举的shaper)查询NumericShaper
对象支持的范围。
您可以使用传统的基于位掩码的常量或基于Range
枚举的常量。在决定使用哪个时,请考虑以下几点:
Range
API需要JDK 7或更高版本。Range
API涵盖的Unicode范围比基于位掩码的API更多。Range
API稍快。示例ArabicDigits
旨在使用特定语言的shaper,但有时必须根据语言环境呈现数字。例如,如果数字前面的文本使用泰语脚本,优先显示泰语数字。如果文本显示为藏文,则首选显示藏文数字。
你可以使用以下的getContextualShaper
方法来实现:
前两个方法使用位掩码常量,后两个方法使用枚举常量。接受defaultContext
参数的方法允许您在显示文本之前的数字值时指定初始形状。当未定义默认上下文时,任何前导数字都使用拉丁形状显示。
示例ShapedDigits
演示了形状的工作原理。显示了五种文本布局:
ALL_RANGES
位掩码的上下文形状器,但形状器未指定默认上下文。以下代码显示了如何定义形状器(如果使用):
NumericShaper arabic = NumericShaper.getShaper(NumericShaper.ARABIC);
NumericShaper contextualArabic = NumericShaper.getContextualShaper(NumericShaper.ARABIC, NumericShaper.ARABIC);
NumericShaper contextualArabicASCII = NumericShaper.getContextualShaper(NumericShaper.ARABIC);
NumericShaper contextualAll = NumericShaper.getContextualShaper(NumericShaper.ALL_RANGES);
有关更多实现细节,请参见ShapedDigits.java
示例。