文档

Java™ 教程-Java Tutorials 中文版
使用 JTextComponent 类处理双向文本
Trail: Internationalization
Lesson: Working with Text

使用 JTextComponent 类处理双向文本

本节讨论如何使用 JTextComponent 类处理双向文本。双向文本是包含从左到右和从右到左两个方向运行的文本的文本。双向文本的示例是包含数字(从左到右运行)的阿拉伯文本(从右向左运行)。显示和管理双向文本更加困难;但 JTextComponent 会为你处理这些问题。

涵盖以下主题:

有关这些问题的更多信息,或者如果你需要更多控制来处理这些问题,请参阅 2D Graphics 路径中的 Working with Bidirectional Text

确定双向文本的方向性

示例 BidiTextComponentDemo.java,基于 TextComponentDemo.java,在 JTextPane 对象中显示双向文本。在大多数情况下,Java 平台可以确定双向 Unicode 文本的方向性:

BidiTextComponentDemo.java

在 JTextComponent 对象中显式指定文本运行方向

你可以指定 JTextComponent 对象的 Document 对象的运行方向。例如,以下语句指定 JTextPane 对象 textPane 中的文本从右向左运行:

textPane.getDocument().putProperty(
    TextAttribute.RUN_DIRECTION,
    TextAttribute.RUN_DIRECTION_RTL);

或者,你可以根据语言环境指定特定 Swing 组件的组件方向。例如,以下语句指定对象 textPane 的组件方向基于 ar-SA 语言环境:

Locale arabicSaudiArabia = 
    new Locale.Builder().setLanguage("ar").setRegion("SA").build();

textPane.setComponentOrientation(
    ComponentOrientation.getOrientation(arabicSaudiArabia));

由于阿拉伯语的运行方向是从右到左,因此 textPane 对象中包含的文本的运行方向也是从右到左。

有关详细信息,请参阅 Setting Component Orientation 部分。

显示和移动插入符

在可编辑文本中,caret (插入符号) 用于以图形方式表示当前插入点,即文本中将插入新字符的位置。在 BidiTextComponentDemo.java 示例中,插入符号包含一个小三角形,指向插入字符的显示方向。

默认情况下,JTextComponent 对象创建一个由所有 JTextComponent 实例共享的映射(Keymap 类型)作为默认键映射。键映射允许应用程序将键击绑定到操作。默认键映射(对于支持插入符移动的 JTextComponent 对象)包括使用左右箭头键向前和向后移动插入符号之间的绑定,支持插入符在双向文本中移动。

命中测试

通常,设备空间中的位置必须转换为文本偏移量。例如,当用户在可选文本上单击鼠标时,鼠标的位置将转换为文本偏移并用作选择范围的一端。从逻辑上讲,这与定位插入符相反。

你可以将插入符监听器附加到 JTextComponent 的实例。插入符号监听器使你能够处理插入符号事件,这些事件在插入符号移动或文本组件中的选择发生更改时发生。使用 addCaretListener 方法附加插入符监听器。有关详细信息,请参阅 How to Write a Caret Listener

高亮选择

选定的字符范围以图形方式由高亮区域表示,高亮区域中的字形以反转影像或不同背景色显示。

JTextComponent对象实现逻辑高亮。这意味着所选字符在文本模型中始终是连续的,并且允许高亮区域不连续。以下是逻辑高亮的示例:

BidiTextComponentDemo:逻辑高亮

设置组件方向

Swing 的布局管理器了解语言环境如何影响 UI;没有必要为每个语言环境创建新布局。例如,在文本从右向左流动的语言环境中,布局管理器将以相同的方向排列组件。

示例 InternationalizedMortgageCalculator.java 已针对美国英语;英国英语;法国法语;加拿大法国;和沙特阿拉伯阿拉伯语进行了本地化。

以下使用 en-US 语言环境:

按揭计算器,en-US 语言环境

以下使用 ar-SA 语言环境:

按揭计算器,ar-SA 语言环境

请注意,组件的布局方向与相应的语言环境相同:en-US 从左到右,ar-SA 从右到左。InternationalizedMortgageCalculator.java 示例调用方法 applyComponentOrientationgetOrientation 按语言环境指定其组件的方向:

private static JFrame frame;

// ...

private static void createAndShowGUI(Locale currentLocale) {

    // Create and set up the window.
    // ...
    // Add contents to the window.
    // ...
    frame.applyComponentOrientation(
        ComponentOrientation.getOrientation(currentLocale));
    // ...
  }

示例 InternationalizedMortgageCalculator.java 需要以下资源文件:


Previous page: Normalizing Text
Next page: Internationalization of Network Resources