使用 JTextComponent 类处理 Double 向文本
本节讨论如何使用JTextComponent类处理 Double 向文本。Double 向文本是包含沿两个方向(从左到右和从右到左)运行的文本的文本。Double 向文本的一个示例是阿拉伯数字(从右至左排列),其中包含数字(从左至右排列)。显示和 管理Double 向文本更加困难;但是JTextComponent为您解决了这些问题。
涵盖以下主题:
有关这些问题的更多信息,或者想要在处理这些问题上获得更多控制,请参阅2D Graphics跟踪中的使用 Double 向 Literals。
确定 Double 向文本的方向性
基于TextComponentDemo.java的示例BidiTextComponentDemo.java在JTextPane对象中显示 Double 向文本。在大多数情况下,Java 平台可以确定 Double 向 Unicode 文本的方向性:
在 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个对象实现逻辑突出显示。这意味着所选字符在文本模型中始终是连续的,并且突出显示区域允许是不连续的。以下是逻辑突出显示的示例:
设置组件方向
Swing 的布局 管理 器了解语言环境如何影响 UI。不必为每个语言环境创建新的布局。例如,在文本从右到左流动的语言环境中,布局 管理 器将以相同的方向排列组件。
samplesInternationalizedMortgageCalculator.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));
// ...
}
samplesInternationalizedMortgageCalculator.java需要以下资源文件: