2016-12-14 3 views
0

У меня есть JTextPane с типом контента «text/html». Он интегрирован в JScrollPane.Java - получение/установка высоты строки JTextPane с типом контента «text/html»

Пользователь может прокрутить вниз в этом JTextPane и нажимает кнопку. В этот момент я хочу вычислить самую верхнюю реальную видимую строку JTextPane!

То, что я нашел в другом посте здесь, где эти линии:

public Integer getActualDisplayedRows() { 
    int y1 = jtextpane.getVisibleRect().y; 
    int lineHeight = jtextpane.getFontMetrics(jtextpane.getFont()).getHeight(); 
    int topMostRow = (int) Math.ceil((double) y1/lineHeight); 
    return topMostRow; 
} 

Но это не правильно вычислить .. Количество в lineHeight слишком мал. Так что, если я перечисляю на 20-й строке -для ПРИМЕР- метод возвращает более 20 ..

Я попытался установить высоту строки с помощью таблицы стилей (например, here):

StyleSheet sh = editorKit.getStyleSheet(); 
sh.addRule("body {line-height: 50px}"); 

Но Безразлично Неважно, какой номер пикселя я установил там, итоговый JTextPane всегда имеет ту же высоту (и я использую тег body).

Есть ли у вас какие-либо предложения?

Большое вам спасибо за помощь!

+0

HTML-документ может иметь контент в нескольких шрифтах. Вы пытаетесь определить высоту строки шрифта элемента body? – VGR

ответ

1

Если я понимаю ваше требование, вы просто хотите узнать номер строки в верхней части окна просмотра?

Вот код для получения строки в позиции курсора:

public static int getLineAtCaret(JTextComponent component) 
{ 
    int caretPosition = component.getCaretPosition(); 
    Element root = component.getDocument().getDefaultRootElement(); 

    return root.getElementIndex(caretPosition) + 1; 
} 

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

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

Таким образом, вы должны иметь возможность использовать метод текстового поля viewToModel(...). Что-то вроде:

int y = textPane.getVisibleRect().y; 
Point p = new Point(5, y); 
int offset = textPane.viewToModel(p); 
+0

Да, это точно мое требование! Что я должен делать с вычисленным смещением и результатом getLineAtCaret? Добавить, вычесть с помощью афоризмы? Я не понимаю, извините! – mrbela

+0

P.S .: Если бы я мог установить высоту линии (упомянутый пример не работает неудачно), я бы знал, насколько высока линия. Это также решит мое требование – mrbela

+0

@mrbela, я сказал, что вам нужно «изменить» код из предоставленного метода. Вместо использования смещения каретки вам необходимо использовать смещение окна просмотра. – camickr

Смежные вопросы