Определение того, какой текст существует в области JTextArea, когда текст расположен справа налево

У меня есть код, который пытается определить, какой текст находится в заданном вертикальном срезе текстовой области, где вертикальный срез указан как координаты Y, а не строки.

Между прочим, преобразование в использование линейной математики является прекрасным обходным путем для этой проблемы, так что я собираюсь пойти с этим, но я могу предусмотреть случаи, когда у вас может быть только координата Y, и это похоже на что-то вроде этого. придет, так что я собираюсь спросить его в любом случае.

Я сократил свою проблему до довольно минималистского (смеется, Java) примера. Мы отображаем фрейм с текстом, а затем пытаемся определить смещение символа текста, ближайшего к началу текстовой области. Мы знаем из здравого смысла, что это будет 0, но проблема заключается в том, чтобы вычислить это программно.

public static void main(String[] args) throws Exception {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new RtlTest().run();
        }
    });
}

JFrame frame;
JTextArea textArea;

public void run() {
    textArea = new JTextArea(
        "\u05D4\u05D5\u05D3\u05E2\u05EA \u05D8\u05D9\u05D9\u05D2\u05E8 " +
        "\u05D8\u05E7\u05E1\u05D8 \u05D1\u05E2\u05D1\u05E8\u05D9\u05EA");

    frame = new JFrame();
    frame.setLayout(new BorderLayout());
    frame.add(new JScrollPane(textArea), BorderLayout.CENTER);
    frame.setSize(400, 300);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setVisible(true);
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            measure();
        }
    });
}

public void measure() {
    try {
        System.out.println("Either the line is left to right or it's right to left " +
                           "(or a mix), so one of these two values should be 0:");
        System.out.println(textArea.viewToModel(new Point(0, 0)));
        System.out.println(textArea.viewToModel(new Point(textArea.getWidth() - 1, 0)));

        Rectangle firstLetterView = textArea.modelToView(0);
        System.out.println("This one should definitely be 0, right? " +
                           "I mean, we got the coordinates from Swing itself:");
        System.out.println(textArea.viewToModel(new Point(firstLetterView.x,
                                                          firstLetterView.y)));

        frame.dispose();
    } catch (BadLocationException e) {
        throw new IllegalStateException(e);
    }
}

Вывод довольно удивителен:

Either the line is left to right or it's right to left (or a mix),
    so one of these two values should be 0:
23
23
This one should definitely be 0, right? I mean, we got the coordinates from Swing itself:
24

Точки неожиданности:

  1. Символ, ближайший к верхнему левому углу, не является символом 0.
  2. Символ, ближайший к верхнему правому углу, не является символом 0.
  3. Символ, ближайший к позиции символа 0, не является символом 0.

person Trejkaz    schedule 28.09.2012    source источник
comment
возможно, это не так для Java7, но есть / есть некоторая ошибка (не удалось найти обходной путь, исправленный) для одного из языков RTL (не знание RTL и не использование этого), но если я правильно помню, чтобы использовать JTextPane для RIGHT_TO_LEFT   -  person mKorbel    schedule 02.10.2012


Ответы (1)


Добавьте следующую строку в свой код:

textArea.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

Ваши выходные числа изменятся, но ваш текст будет отображаться с правой стороны текстовой области. Я надеюсь, это то, что вы хотите.

РЕДАКТИРОВАТЬ:

Согласно этому ивриту и арабскому языку следует быть в ориентации RT.

person Rempelos    schedule 29.09.2012
comment
Интересно. Хорошо, теперь второй тест печатает 0, как и ожидалось, но первый по-прежнему печатает 23 для обоих значений, что все еще удивительно. Я на самом деле не знаю, чего хочу, хотя, заметьте. Это приложение работает на английском языке. Кто-то просто случайно нашел текст для отображения в нем, который оказался на иврите, но я не знаю, является ли это достаточным основанием для изменения самого компонента с LTR на RTL. На самом деле это решение должен принимать Свинг, а не я. - person Trejkaz; 02.10.2012
comment
Вы уверены, что он по-прежнему печатает 23 для обоих значений? Когда я запускаю его, вывод имеет следующий порядок: 23, 0, 0. Не забудьте добавить строку сразу после создания текстовой области. - person Rempelos; 02.10.2012
comment
23, 23, 0. Даже если я удалю текст из конструктора и вызову setComponentOrientation() перед вызовом setText(). - person Trejkaz; 05.10.2012
comment
Ах. В Windows Look&Feel я получаю 23,23,0. В Java Look&Feel по умолчанию я получаю 23,0,0. Я ненавижу такое дерьмо. :( - person Trejkaz; 05.10.2012
comment
Извините, я больше ничем не могу вам помочь... Я понятия не имею, почему это происходит (я тоже ненавижу подобное дерьмо ;) - person Rempelos; 06.10.2012