本Java教程适用于JDK 8。本页面描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言功能的摘要,请参阅Java语言变更。
有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息,请参阅JDK发布说明。
本节讨论如何使用JTextComponent
类处理双向文本。双向文本是包含从左向右和从右向左两个方向运行的文本。双向文本的一个例子是包含从右向左运行的阿拉伯文本和从左向右运行的数字的文本。显示和管理双向文本更加困难,但是JTextComponent
类可以为您处理这些问题。
以下主题将被涵盖:
有关这些问题的更多信息,或者如果您想要更多地控制这些问题,请参阅处理双向文本。
示例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
对象中包含的文本的运行方向也是从右到左。
有关更多信息,请参见设置组件方向部分。
在可编辑文本中,插入符用于以图形方式表示当前插入点,即新字符将插入的文本位置。在BidiTextComponentDemo.java
示例中,插入符包含一个指向新插入字符显示方向的小三角形。
默认情况下,JTextComponent
对象会创建一个键映射(类型为Keymap
),该键映射被所有JTextComponent
实例共享作为默认键映射。键映射允许应用程序将键击绑定到操作。默认键映射(用于支持插入符移动的JTextComponent
对象)包括插入符向前和向后移动与左右箭头键绑定,从而支持双向文本的插入符移动。
通常,设备空间中的位置必须转换为文本偏移量。例如,当用户在可选择的文本上单击鼠标时,鼠标的位置将被转换为文本偏移量,并用作选择范围的一端。从逻辑上讲,这是定位插入符的逆操作。
您可以将插入符侦听器附加到JTextComponent
的实例上。插入符侦听器使您能够处理插入符事件,这些事件在插入符移动或文本组件中的选择发生更改时发生。您可以使用addCaretListener
方法附加插入符侦听器。有关更多信息,请参见如何编写插入符侦听器。
选定的字符范围以高亮区域的形式在图形上表示,其中字形以反色或不同的背景颜色显示。
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) { // 创建和设置窗口。 // ... // 添加内容到窗口。 // ... frame.applyComponentOrientation( ComponentOrientation.getOrientation(currentLocale)); // ... }
示例InternationalizedMortgageCalculator.java
需要以下资源文件: