在 JTextArea 中强制 RTL 顺序

Forcing RTL order in a JTextArea

我试图强制 JTextArea(以及通过我的应用程序的其他文本组件)允许用户键入 RTL。这适用于阿拉伯语等输入,但我还必须能够将其设置为将其应用于标准文本。因此,如果我键入 "hello!",它将显示为“!olleh”。

我试过使用 applyOrientation() 方法并将文本区域设置为具有 RTL,如下所示:

jTextPane1.getDocument().putProperty(
        TextAttribute.RUN_DIRECTION,
        TextAttribute.RUN_DIRECTION_RTL);

到目前为止我还没有成功。有人建议我尝试 Bidi 库,但这些库似乎侧重于对已经双向的文本的解释。当我应用上面的内容时,我得到了右对齐的文本,但它在字符顺序方面仍然是 LTR。我在这里缺少什么吗?有没有办法设置 Java 本身在寻找文本输入应移动克拉的方向时检查的值?

组件方向如何?

boolean rtl = true;
t_text.setComponentOrientation(rtl ? 
    ComponentOrientation.RIGHT_TO_LEFT : 
    ComponentOrientation.LEFT_TO_RIGHT);

你说的你好!并且 !olleh 不会发生这样的事情 :) 这是反向的,而不是从右到左的。 I am Soley! 的 RTL 是 !Soley am I 它显示从右到左开始的单词。

顺便说一下,使用 JTextPane 而不是 JTextArea,我认为 JTextArea 不支持 RTL。那是我想制作一次 JtextPane RTL 时在某处读到的内容。

嗯,如果你想反转输入的字符串,使用:

public static String getReverse(String str) {
   return new StringBuffer(str).reverse().toString();
}

但是,如果你想反转所有的单词,那么在你反转整个输入之后再拆分它们:

String[] list = getReverse("I am soley!").split(" ");
String[] ret = new String[list.length];
int len = list.length;
for(String w:list){
   ret[--len] = s;
}
list = null;
// you have your words reversed in ret array

RealSkeptic 指出的 \u202e 和 \u202c 字符解决了我的问题。一个将强制其后的所有字符变为 RTL 格式,另一个将其后的所有字符强制变为 LTR 格式。这是一个快速而肮脏的修复,但对于我的问题,它提供了我需要的解决方案。