|
Spec-Zone .ru
спецификации, руководства, описания, API
|
По умолчанию, когда текст содержит числовые значения, те значения выводятся на экран, используя латинские (европейские) цифры. Когда другие формы цифры Unicode предпочитаются, используйте java.awt.font.NumericShaper class. NumericShaper API позволяет Вам вывести на экран числовое значение, представленное внутренне как значение ASCII в любой форме цифры Unicode.
Следующий фрагмент кода, от
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 экземпляр для арабских цифр выбирается и помещается в a HashMap для TextLayout.NUMERIC_SHAPING ключ атрибута. Карту хеша передают к TextLayout экземпляр. После рендеринга текста в paint метод, цифры выводятся на экран в требуемом сценарии. В этом примере латинские цифры, 0 до 9, оттягиваются как арабские цифры.

Предыдущий пример использует NumericShaper.ARABIC постоянный, чтобы получить требуемый формирователь, но class обеспечивает константы для многих языков. Эти константы определяются как битовые маски и упоминаются как NumericShaper основанные на битовой маске константы.
Альтернативный способ определить определенный набор цифр состоит в том, чтобы использовать перечислимый тип (перечисление). Это перечисление, представленное в Java SE 7 выпусков, также обеспечивает ряд . Хотя эти константы определяются, используя различные механизмы, NumericShaper.ARABIC битовая маска функционально эквивалентна NumericShaper.Range.ARABIC перечисление, и есть соответствие getShaper метод для каждого постоянного типа:
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 методы принимают a singleRange параметр. С любым постоянным типом можно определить диапазон специфичных для сценария цифр. Основанные на битовой маске константы могут быть объединены, используя OR операнд, или можно создать ряд NumericShaper.Range перечисления. Следующие шоу, как определить диапазон, используя каждый постоянный тип:
NumericShaper.MONGOLIAN | NumericShaper.THAI |
NumericShaper.TIBETAN
EnumSet.of(
NumericShaper.Range.MONGOLIAN,
NumericShaper.Range.THAI,
NumericShaper.Range.TIBETAN)
Можно запросить NumericShaper объект определить, какие диапазоны это поддерживает использование любого getRanges метод для основанных на битовой маске формирователей или метод для основанных на перечислении формирователей.
Можно использовать или традиционный бит замаскированные на основе константы или Range основанные на перечислении константы. Вот некоторые соображения, решая, чтобы использовать:
Range API требует JDK 7 или позже.Range API покрывает больше диапазонов Unicode чем замаскированный битом API.Range API.
Можно выполнить это использование одного из getContextualShaper методы:
Первые два метода используют константы битовой маски, и последние два используют перечислимые константы. Методы, которые принимают a defaultContext параметр позволяет Вам определить начальный формирователь, который используется, когда числовые значения выводятся на экран перед текстом. Когда никакой контекст значения по умолчанию не определяется, любые ведущие цифры выводятся на экран, используя латинские формы.
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 пример для дальнейших деталей реализации.