Utilisation de Java, y a-t-il un moyen intégré pour rendre texte de sorte que c'est limité à un rectangle sur un objet graphique code> graphique2d code>?
Je sais que je peux utiliser Je sais aussi que je peux utiliser p> pour obtenir les informations sur les limites de Une chaîne lorsqu'elle est rendue en utilisant des caractères code> sur certains Donc, je pouvais commencer à boucher, briser ma chaîne et ainsi de force à l'adapter à un rectangle. P> Mais je préférerais de loin ne pas avoir à écrire ceux-ci ... p> Y a-t-il une fonction prête à faire qui le fera pour moi? P> P> graphique2d.drawstring < / code> mais il ne tire qu'une ligne de texte Sinlge. p>
graphiques2d graphiques code> objet. P>
5 Réponses :
Ceci ici pourrait être ce que vous recherchez:
stringutils.java: strong> p> vous mettriez ceci à sa manière classe, puis simplement en utilisant ce que vous aviez: p> appel wrap (string str, fFM, int maxwidth) code> qui retournera un
Liste code> de
chaîne code> S qui a été enveloppé en conséquence de votre
maxwidth code> qui sera la largeur du
rectangle2d code> Le texte sera mis. dans: p>
Voir le p> LabelRendertest code> source dans Cette réponse . Il utilise HTML / CSS, avec le réglage de la largeur du corps à l'aide de CSS et rend ainsi la ligne d'enveloppe automatique. P>
S'il vous plaît Acceptez la réponse si cela aidait à résoudre le problème.
J'ai écrit une petite fonction qui peut aider. 447 est la largeur disponible que vous pouvez obtenir de votre largeur requise pour rendre texte sur.
private void drawTextUgly(String text, FontMetrics textMetrics, Graphics2D g2) { // Ugly code to wrap text int lineHeight = textMetrics.getHeight(); String textToDraw = text; String[] arr = textToDraw.split(" "); int nIndex = 0; int startX = 319; int startY = 113; while ( nIndex < arr.length ) { String line = arr[nIndex++]; while ( ( nIndex < arr.length ) && (textMetrics.stringWidth(line + " " + arr[nIndex]) < 447) ) { line = line + " " + arr[nIndex]; nIndex++; } GraphicsUtility.drawString(g2, line, startX, startY); startY = startY + lineHeight; } }
private List<String> wrap(String txt, FontMetrics fm, int maxWidth){ StringTokenizer st = new StringTokenizer(txt) ; List<String> list = new ArrayList<String>(); String line = ""; String lineBeforeAppend = ""; while (st.hasMoreTokens()){ String seg = st.nextToken(); lineBeforeAppend = line; line += seg + " "; int width = fm.stringWidth(line); if(width < maxWidth){ continue; }else { //new Line. list.add(lineBeforeAppend); line = seg + " "; } } //the remaining part. if(line.length() > 0){ list.add(line); } return list; }
Utilisez temporaire JTextarea pour effectuer une emballage de ligne parfaite avec ~ 10 lignes de code:
C'est agréable de voir que quelqu'un se soucie toujours de répondre à une question Q, il y a 8,5 ans. J'apprécie les efforts. Je ne sais pas pourquoi je me suis demandé cela ni pourquoi je n'ai accepté aucune réponse dans le passé (j'essaie de ne pas quitter Open Q). Je n'ai pas non plus d'environnement pour tester votre réponse (ni le temps de le faire) - cependant, en voyant que c'est court, récent et au moins semble faire ce que j'ai demandé il y a tant, je vais accepter votre réponse et laisser la communauté voter sur ce...
Personnellement, j'aime l'exemple prouvé par Andrew car il est relativement rapide à atteindre. J'ai toutefois utilisé cette approche dans le passé Java.sun .com / Developer / OnlineTraning / Media / 2Dtext / ...
Des avantages et des inconvénients des deux alternatives?
Je dirais que la solution d'Andrew est plus facile, imho
Dupliqué possible de écrire un texte multif ligne sur une image à l'aide de Java a>