2016-12-14 3 views
0

J'ai un JTextPane avec le type de contenu "text/html". Il est intégré dans un JScrollPane.Java - obtention/définition de la hauteur de ligne de JTextPane avec le type de contenu "text/html"

L'utilisateur peut faire défiler vers le bas dans ce JTextPane et appuie sur un bouton. A ce moment je veux calculer la ligne visible la plus haute du JTextPane!

Ce que je trouve dans un autre post ici où ces lignes:

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; 
} 

Mais cela ne calcule pas correct .. Le nombre lineHeight est trop petit. Donc, si je fais défiler la ligne 20 -pour exemple- la méthode retourne plus de 20 ..

J'ai essayé de régler la hauteur de la ligne par feuille de style (comme here):

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

Mais doesn Quel que soit le nombre de pixels que j'ai mis là, le résultat JTextPane a toujours la même hauteur (et j'utilise le body tag) ..

Avez-vous des suggestions ??

Merci beaucoup pour votre aide!

+0

Un document HTML peut avoir du contenu dans plusieurs polices. Essayez-vous de déterminer la hauteur de ligne de la police de l'élément body? – VGR

Répondre

1

Si je comprends votre exigence, vous voulez juste connaître le numéro de ligne en haut de la fenêtre?

Voici un code pour obtenir la ligne à la position de caret:

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

    return root.getElementIndex(caretPosition) + 1; 
} 

Je ne sais pas si cela fonctionnera pour HTML avec toutes sortes de balises étranges avec des images et des tableaux, etc. Dans ce cas, je Je ne suis pas sûr de ce que le sens de "ligne" serait.

Maintenant, de toute évidence, le curseur ne sera pas en haut de la fenêtre, vous devez donc modifier la logique pour obtenir un "décalage" du texte en haut de la fenêtre.

Vous devriez donc pouvoir utiliser la méthode viewToModel(...) du volet de texte. Quelque chose comme:

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

Oui, c'est exactement mon exigence! Que dois-je faire avec le décalage calculé et le résultat de getLineAtCaret? Ajouter, soustraire avec l'autre? Je ne comprends pas vraiment, désolé! – mrbela

+0

P.S .: Si je pouvais définir la hauteur de la ligne (l'exemple mentionné ne fonctionne pas malencontreusement), je saurais à quelle hauteur la ligne est. Cela permettrait également de résoudre mon exigence – mrbela

+0

@ mrbela, j'ai dit que vous devez "changer" le code de la méthode fournie. Au lieu d'utiliser le décalage du curseur, vous devez utiliser le décalage de la fenêtre. – camickr