У меня есть код, который пытается определить, какой текст находится в заданном вертикальном срезе текстовой области, где вертикальный срез указан как координаты 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
Точки неожиданности:
- Символ, ближайший к верхнему левому углу, не является символом 0.
- Символ, ближайший к верхнему правому углу, не является символом 0.
- Символ, ближайший к позиции символа 0, не является символом 0.