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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 !