2009-08-01 6 views
0

Je rends le texte avec un rendu de cellule de tableau personnalisé et je veux couper le texte dessiné si elle dépasse la largeur de la cellule actuelle, en passant à un "Ce texte est à long ... "genre de représentation, où les trois points à la fin ne quitte jamais la boîte de délimitation. Mon algorithme actuel est le suivant:Comment rendre le texte dans une boîte et remplacer l'excédent avec trois points

FontMetrics fm0 = g2.getFontMetrics(); 
int h = fm0.getHeight(); 
int ellw = fm0.stringWidth("\u2026"); 
int titleWidth = fm0.stringWidth(se.title); 
if (titleWidth > getWidth()) { 
    for (int i = se.title.length() - 1; i > 0; i--) { 
     String tstr = se.title.substring(0, i); 
     int tstrw = fm0.stringWidth(tstr); 
     if (tstrw + ellw < getWidth()) { 
      g2.drawString(tstr, 2, h); 
      g2.drawString("\u2026", 2 + tstrw, h); 
      break; 
     } 
    } 
} else { 
    g2.drawString(se.title, 2, h); 
} 

Y at-il une meilleure façon de déterminer combien de caractères dois-je drawString() avant de passer au caractère ... (u2026)?

Répondre

0

Ceci est le comportement par défaut du moteur de rendu par défaut pour une table, donc je ne suis pas sûr que je comprends la raison de le faire.

Mais j'ai créé un rendu pour les points sur la gauche ("... texte est trop long") qui montre une façon plus complète de faire ce que vous voulez car il prend en compte une éventuelle bordure sur le moteur de rendu et l'espacement intercellulaire du moteur de rendu. Découvrez le LeftDotRenderer.

+0

Merci. La raison en est que la première ligne (un titre) est dessinée en texte de 16pt et les deuxième et troisième lignes (certains détails) sont dessinées en tant que texte normal dans la cellule. Le LeftDotRenderer diffère principalement en ce qu'il compte la taille par caractère avec au lieu de la largeur de chaîne entière. Je vais le tester. – akarnokd

0

Je ne vois pas d'autre moyen d'obtenir l'effet désiré, mais vous devriez pouvoir remplacer les 2 appels drawString() par un seul. Cela fait un moment que j'ai écrit Java mais je pense que ce qui suit devrait fonctionner. Par ailleurs, j'ai changé les noms des variables afin que je puisse lire le code. : P

FontMetrics metrics = g2.getFontMetrics(); 
int fontHeight = metrics.getHeight(); 
int titleWidth = metrics.stringWidth(se.title); 

if (titleWidth > getWidth()) { 
    String titleString; 

    for (int i = se.title.length() - 1; i > 0; i --) { 
     titleString = se.title.substring(0, i) + "\u2026"; 
     titleWidth = metrics.stringWidth(titleString); 

     if (titleWidth < getWidth()) { 
      g2.drawString(titleString, 2, fontHeight); 

      break; 
     } 
    } 
} else { 
    g2.drawString(se.title, 2, fontHeight); 
} 
Questions connexes