2016-12-14 8 views
0

コンテンツタイプ "text/html"のJTextPaneがあります。これはJScrollPaneに統合されています。コンテンツタイプ "text/html"のJavaのget/set行の高さ

ユーザーは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内の数字が小さすぎる..です正しく計算されません。だから、私は-for 20行までスクロールした場合例 - 本方法はもっとして20を返す..

Iは、スタイルシート(here等)を介して行の高さを設定しようとした:

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

しかしdoesnの私がそこに設定したピクセル番号に関係なく、結果としてJTextPaneは常に同じ高さを持っています。

あなたは何か提案がありますか?

ありがとうございました!

+0

HTMLドキュメントには、複数のフォントでコンテンツを含めることができます。 body要素のフォントの行の高さを決定しようとしていますか? – VGR

答えて

1

あなたの要件を理解すれば、ビューポート上部の行番号を知りたいだけですか?ここで

は、キャレット位置の行を取得するためのいくつかのコードです:これは私はこの場合、画像や表などで奇妙なタグのすべての種類のHTMLのために働く場合

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

    return root.getElementIndex(caretPosition) + 1; 
} 

は知ってはいけません「行」の意味がわからない。

明らかに、キャレットはビューポートの一番上にはないので、ビューポートの上部にあるテキストの「オフセット」を得るためにロジックを変更する必要があります。

テキストペインのviewToModel(...)メソッドを使用できるはずです。次のようなものがあります。

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

はい、それはまさに私の要件です!計算されたオフセットとgetLineAtCaretの結果をどうすればいいですか?追加するには、互いに引き算するには?私は本当にそれを得ることはありません、申し訳ありません! – mrbela

+0

P .:もし私が行の高さを設定することができれば(上記の例は不幸にならない)、行の高さを知ることができます。それも私の要求を解決するだろう – mrbela

+0

@mrbela、私はあなたが提供された方法からコードを "変更"する必要があると言いました。キャレットのオフセットを使用する代わりに、ビューポートのオフセットを使用する必要があります。 – camickr