使用 JTextComponent 类处理 Double 向文本

本节讨论如何使用JTextComponent类处理 Double 向文本。Double 向文本是包含沿两个方向(从左到右和从右到左)运行的文本的文本。Double 向文本的一个示例是阿拉伯数字(从右至左排列),其中包含数字(从左至右排列)。显示和 管理Double 向文本更加困难;但是JTextComponent为您解决了这些问题。

涵盖以下主题:

有关这些问题的更多信息,或者想要在处理这些问题上获得更多控制,请参阅2D Graphics跟踪中的使用 Double 向 Literals

确定 Double 向文本的方向性

基于TextComponentDemo.java的示例BidiTextComponentDemo.javaJTextPane对象中显示 Double 向文本。在大多数情况下,Java 平台可以确定 Double 向 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对象中包含的文本的运行方向也是从右到左。

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

显示和移动 Caret

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

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

Hit Testing

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

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

Highlighting Selections

选定的字符范围由高亮区域以图形方式表示,高亮区域是显示字形的区域,该字形以反向视频或不同的背景色显示。

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

BidiTextComponentDemo:逻辑突出显示

设置组件方向

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

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

以下使用 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));
    // ...
  }

samplesInternationalizedMortgageCalculator.java需要以下资源文件: