文档

Java™ 教程
隐藏目录
使用 JTextComponent 类处理双向文本
路径:国际化
课程:处理文本

使用JTextComponent类处理双向文本

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

以下主题将被涵盖:

有关这些问题的更多信息,或者如果您想要更多地控制这些问题,请参阅处理双向文本

确定双向文本的方向性

示例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对象中包含的文本的运行方向也是从右到左。

有关更多信息,请参见设置组件方向部分。

显示和移动插入符

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

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

命中测试

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

您可以将插入符侦听器附加到JTextComponent的实例上。插入符侦听器使您能够处理插入符事件,这些事件在插入符移动或文本组件中的选择发生更改时发生。您可以使用addCaretListener方法附加插入符侦听器。有关更多信息,请参见如何编写插入符侦听器

突出显示选择内容

选定的字符范围以高亮区域的形式在图形上表示,其中字形以反色或不同的背景颜色显示。

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) {

    // 创建和设置窗口。
    // ...
    // 添加内容到窗口。
    // ...
    frame.applyComponentOrientation(
        ComponentOrientation.getOrientation(currentLocale));
    // ...
  }

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


上一页:文本规范化
下一页:网络资源的国际化