Изменение вида 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?


person Community    schedule 01.04.2019    source источник


Ответы (1)


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

myScrollPane.getVerticalScrollBar().setValue()

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

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

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

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

person Evan    schedule 01.04.2019