Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
本节讨论如何使用 JTextComponent
类处理双向文本。双向文本是包含从左到右和从右到左两个方向运行的文本的文本。双向文本的示例是包含数字(从左到右运行)的阿拉伯文本(从右向左运行)。显示和管理双向文本更加困难;但 JTextComponent
会为你处理这些问题。
涵盖以下主题:
有关这些问题的更多信息,或者如果你需要更多控制来处理这些问题,请参阅 2D Graphics 路径中的 Working with Bidirectional Text。
示例 BidiTextComponentDemo.java
,基于 TextComponentDemo.java
,在 JTextPane
对象中显示双向文本。在大多数情况下,Java 平台可以确定双向 Unicode 文本的方向性:
你可以指定 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
对象实现逻辑高亮。这意味着所选字符在文本模型中始终是连续的,并且允许高亮区域不连续。以下是逻辑高亮的示例:
Swing 的布局管理器了解语言环境如何影响 UI;没有必要为每个语言环境创建新布局。例如,在文本从右向左流动的语言环境中,布局管理器将以相同的方向排列组件。
示例 InternationalizedMortgageCalculator.java
已针对美国英语;英国英语;法国法语;加拿大法国;和沙特阿拉伯阿拉伯语进行了本地化。
以下使用 en-US 语言环境:
以下使用 ar-SA 语言环境:
请注意,组件的布局方向与相应的语言环境相同:en-US 从左到右,ar-SA 从右到左。InternationalizedMortgageCalculator.java
示例调用方法 applyComponentOrientation
和 getOrientation
按语言环境指定其组件的方向:
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
需要以下资源文件: