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


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

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

Я сократил свою проблему до довольно минималистский (LoL 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(
        "u05D4u05D5u05D3u05E2u05EA u05D8u05D9u05D9u05D2u05E8 " +
        "u05D8u05E7u05E1u05D8 u05D1u05E2u05D1u05E8u05D9u05EA");

    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.
1 3

1 ответ:

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

textArea.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

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

Правка:

Согласно это иврит и арабский должны быть в ориентации RT.