Spec-Zone .ru
спецификации, руководства, описания, API
|
По умолчанию, когда текст содержит числовые значения, те значения выводятся на экран, используя латинские (европейские) цифры. Когда другие формы цифры Unicode предпочитаются, используйте java.awt.font.NumericShaper
class. NumericShaper
API позволяет Вам вывести на экран числовое значение, представленное внутренне как значение ASCII в любой форме цифры Unicode.
Следующий фрагмент кода, от ArabicDigits
пример, шоу, как использовать a 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
экземпляр для арабских цифр выбирается и помещается в a HashMap
для TextLayout.NUMERIC_SHAPING
ключ атрибута. Карту хеша передают к TextLayout
экземпляр. После рендеринга текста в paint
метод, цифры выводятся на экран в требуемом сценарии. В этом примере латинские цифры, 0 до 9, оттягиваются как арабские цифры.
Предыдущий пример использует NumericShaper.ARABIC
постоянный, чтобы получить требуемый формирователь, но NumericShaper
NumericShaper
основанные на битовой маске константы.
Альтернативный способ определить определенный набор цифр состоит в том, чтобы использовать NumericShaper.Range
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
методы принимают a singleRange
параметр. С любым постоянным типом можно определить диапазон специфичных для сценария цифр. Основанные на битовой маске константы могут быть объединены, используя OR
операнд, или можно создать ряд NumericShaper.Range
перечисления. Следующие шоу, как определить диапазон, используя каждый постоянный тип:
NumericShaper.MONGOLIAN | NumericShaper.THAI | NumericShaper.TIBETAN EnumSet.of( NumericShaper.Range.MONGOLIAN, NumericShaper.Range.THAI, NumericShaper.Range.TIBETAN)
Можно запросить NumericShaper
объект определить, какие диапазоны это поддерживает использование любого getRanges
метод для основанных на битовой маске формирователей или getRangeSet
Можно использовать или традиционный бит замаскированные на основе константы или Range
основанные на перечислении константы. Вот некоторые соображения, решая, чтобы использовать:
Range
API требует JDK 7 или позже.Range
API покрывает больше диапазонов Unicode чем замаскированный битом API.Range
API. ArabicDigits
пример был разработан, чтобы использовать формирователь для определенного языка, но иногда цифры должны быть представлены согласно контексту языка. Например, если текст, который предшествует цифрам, использует тайский сценарий, тайские цифры предпочитаются. Если текст выводится на экран в тибетских, тибетских цифрах, предпочитаются.
Можно выполнить это использование одного из getContextualShaper
методы:
Первые два метода используют константы битовой маски, и последние два используют перечислимые константы. Методы, которые принимают a 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
пример для дальнейших деталей реализации.