2015-06-01 5 views
1

Я пытаюсь заставить JTextArea (и другие текстовые компоненты через мое приложение) разрешить пользователям вводить RTL. Это корректно работает для ввода, такого как арабский, но я также должен установить его для применения к стандартным текстам. Поэтому, если я наберу «привет!» он будет отображаться как «! olleh».Формирование заказа RTL в JTextArea

Я попытался с помощью метода applyOrientation() и установив текстовую область, чтобы иметь RTL выглядеть примерно так:

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

Я не имел успеха до сих пор. Было высказано предположение, что я пытаюсь использовать библиотеки Bidi, но они, похоже, сосредоточены на интерпретации текста, который уже двунаправлен. Когда я применяю вышеуказанное, я получаю правильный текст, но он остается LTR в терминах порядка символов. Есть ли что-то, что мне здесь не хватает? Есть ли способ установить значение, которое сама Java проверяет при поиске, в каком направлении текст должен перемещаться карат?

+0

Каретка - это место, где будет введен следующий символ, он не имеет никакого отношения к визуализации текста. Кроме того, есть ли причина, по которой вы хотите, чтобы символы, которые по определению Unicode, а не RTL, отображались как RTL? – RealSkeptic

+0

Я создаю программу, используемую лингвистами, и они должны иметь возможность создавать шрифты, представляющие новые наборы символов, и иметь возможность печатать с использованием шрифтов RTL. Большинство, что они создали до сих пор, просто помещают новых персонажей поверх существующих букв. Когда у вас есть символы, которые не включены в юникод, и вам нужно решение, которое не так привлекательно, как получение одобренных Unicode, это казалось лучшим решением. –

+0

Как насчет наборов символов, которые должны быть «RTL» на арабском/фарси/иврите? – RealSkeptic

ответ

0

Моя проблема была решена символами \ u202e и \ u202c, отмеченными RealSkeptic. Один из них заставит всех персонажей следовать за ним в форме RTL, а другой заставляет всех символов следовать за ним в форму LTR. Это быстрое и грязное исправление, но для моей проблемы оно предложило нужное мне решение.

0

Что относительно ориентации компонентов?

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

что вы сказали о приветствии! и! olleh ничего подобного не произойдет :) это наоборот не справа налево. RTL Я - Солей! is ! 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 
+0

Это ориентация - половина того, что мне нужно, но «привет!» -> «! olleh» - другая половина. Знаете ли вы, каким образом я могу заставить Java сделать это? –

+0

Отменить его при наборе текста? – Soley

+0

Да, я ищу, чтобы он менялся во время ввода. Обычно обращение к порядку символов было очень простым, но мне нужно, чтобы люди печатали и вводили текст следующим образом. –