Изменение представления JScrollPane, чтобы была видна определенная часть JEditorPane

#java #swing #jscrollpane #jeditorpane

#java #swing #jscrollpane #jeditorpane

Вопрос:

Как мне сделать видимой определенную строку текста в JEditorPane, когда она находится в JScrollPane?

 private JEditorPane myEditorPane = new JEditorPane();
private JScrollPane myScrollPane = new JScrollPane(myEditorPane);

myEditorPane.setContentType("text/html");
myEditorPane.setText("<html>"   getMyString(x)   "</html>");
myEditorPane.repaint();
  

getMyString получает длинную строку со многими строками, разделенными символом n.
Программа имеет 2 панели. Затем программа переходит к строкам на вышеупомянутой панели и для каждой подчеркивает текст в этой строке и отображает соответствующее изображение на другой панели. Каждая просматривается в течение 1 секунды, затем переходит к подчеркиванию следующей строки текста и показу следующего изображения. Я перевожу это вниз и подчеркиваю их по очереди, отображая соответствующие изображения для каждой подчеркнутой строки текста. Но область прокрутки каждый раз переходит к началу.

Я думаю, мне нужно использовать scrollRectToVisible в окне просмотра, но как мне узнать, что такое прямоугольник для части строки в JEditorPane?

Ответ №1:

Я смог управлять положением полосы прокрутки, напрямую вызывая setValue на полосе прокрутки.

 myScrollPane.getVerticalScrollBar().setValue()
  

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

Как только вы это получите, вы преобразуете индекс строки в позицию редактора Y, умножая индекс строки на высоту редактора на количество строк и устанавливаете соответственно.

 myScrollPane.getVerticalScrollBar().setValue( (int) indexOfCurrentLine * myEditorPane.getHeight() / countOfLines );
  

Очевидно, что я не смог протестировать что-либо из этого без SSCCE.