2016-12-14 54 views
0

我有內容類型「text/html的」一個JTextPane。它集成在JScrollPane中。爪哇 - 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