Optimisation d'une fonction de découpage en sous-chaine
Bonjour,
J'ai hésité à mettre ce sujet dans java général, interfaces graphiques ou algorithmique, mais je pense qu'il a plus sa place ici.
La fonction drawString(String texte, int posX, int posY) permet d'écrire une ligne de texte dans un panel. J'ai voulu écrire une fonction (plutot une méthode statique) qui permet d'écrire un paragraphe complet. Cette fonction doit reconnaitre les saut de ligne "\n" pour faire des retours à la ligne, et le dernier argument permet de définir une taille maximum (en pixel) pour le paragraphe. Si une ligne dépasse cette taille, il va falloir couper la ligne en ajoutant artificiellement des retours à la ligne.
La fonction que j'ai écrit marche, mais semble être une usine à gaz !
Je voudrais votre avis, et si possible l'optimiser. Voila le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| public static void dessinerParagraphe(Graphics g, String paragraphe, int posX, int posY, int longMax) {
int i;
FontMetrics fm = g.getFontMetrics();
// Le vecteur suivant doit contenir toutes les lignes écrite à la fin
Vector<String> ligne = new Vector<String>();
// On coupe le paragraphe en section
String section[] = paragraphe.split("\n");
int nbSection = section.length;
for(i=0; i < nbSection; i++) {
// On teste si la ligne est plus longue que la taille spécifiée
if(longMax > 0 && fm.stringWidth(section[i]) > longMax) {
int mem = 0, k = 0;
String ssChaine;
StringBuffer sb = new StringBuffer(section[i]);
do {
// On garde en mémoire le premier espace
mem = k;
// On cherche le suivant espace
k = sb.indexOf(" ", mem+1);
// Si on n'est pas arrivé en bout de chaine
if( k != -1) {
// On prends la dernière sous chaine
ssChaine = sb.substring(0, k);
// Si on dépasse la taille max, alors...
if( fm.stringWidth(ssChaine) > longMax ) {
// On ajoute la sous chaine précédente
ssChaine = sb.substring(0, mem);
ligne.add(ssChaine);
// On la retire du buffer
sb.delete(0,mem+1);
}
}
} while( k != -1 );
// On ajoute le dernier bout de chaine
ssChaine = sb.toString();
ligne.add(ssChaine);
} else {
// Si pas de restriction sur la longueur, on n'a
// plus qu'a ajouter la ligne sans découper !
ligne.add(section[i]);
}
}
// On récupère la hauteur d'une ligne
int hautLigne = fm.getHeight();
// On dessine ligne par ligne
int nbLigne = ligne.size();
for(i=0; i < nbLigne; i++) {
g.drawString( ligne.get(i) , posX, posY);
posY += hautLigne;
}
} |
Merci aux courageux qui auront pris le temps de lire le code !