9
votes

Comment rendre texte enveloppé sur une image en Java

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 graphique2d ?

Je sais que je peux utiliser graphique2d.drawstring < / code> mais il ne tire qu'une ligne de texte Sinlge.

Je sais aussi que je peux utiliser xxx

pour obtenir les informations sur les limites de Une chaîne lorsqu'elle est rendue en utilisant des caractères sur certains graphiques2d graphiques objet.

Donc, je pouvais commencer à boucher, briser ma chaîne et ainsi de force à l'adapter à un rectangle.

Mais je préférerais de loin ne pas avoir à écrire ceux-ci ...

Y a-t-il une fonction prête à faire qui le fera pour moi?


4 commentaires

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


5 Réponses :



4
votes

Voir le LabelRendertest 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.


1 commentaires

S'il vous plaît Acceptez la réponse si cela aidait à résoudre le problème.



7
votes

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


0 commentaires

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

0 commentaires

2
votes

Utilisez temporaire JTextarea pour effectuer une emballage de ligne parfaite avec ~ 10 lignes de code: xxx


1 commentaires

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...