2008-12-30 5 views
6

Kennt jemand vorhandenen Code, mit dem Sie vollständig ausgerichteten Text in Java2D zeichnen können? Zum Beispiel, wenn ich sagte, drawString("sample text here", x, y, width), gibt es eine vorhandene Bibliothek, die herausfinden könnte, wie viel von diesem Text innerhalb der Breite passt, tun einige Zeichenabstand, um den Text gut aussehen zu lassen, und automatisch Grundwort Verpackung?Vollständige Rechtfertigung mit einem Java Graphics.drawString Ersatz?

Antwort

17

Obwohl es nicht die eleganteste noch robustere Lösung, hier ist eine Methode, die die Font des aktuellen Graphics Objekt nehmen und erhalten ihre FontMetrics, um herauszufinden, wo Sie den Text ziehen und, wenn nötig, in eine neue Zeile bewegen :

public void drawString(Graphics g, String s, int x, int y, int width) 
{ 
    // FontMetrics gives us information about the width, 
    // height, etc. of the current Graphics object's Font. 
    FontMetrics fm = g.getFontMetrics(); 

    int lineHeight = fm.getHeight(); 

    int curX = x; 
    int curY = y; 

    String[] words = s.split(" "); 

    for (String word : words) 
    { 
     // Find out thw width of the word. 
     int wordWidth = fm.stringWidth(word + " "); 

     // If text exceeds the width, then move to next line. 
     if (curX + wordWidth >= x + width) 
     { 
      curY += lineHeight; 
      curX = x; 
     } 

     g.drawString(word, curX, curY); 

     // Move over to the right for next word. 
     curX += wordWidth; 
    } 
} 

unter Verwendung der split Methode mit einem Leerzeichen als nur Worttrenn, die gegebenen String in ein Array von String zu trennen, so ist es wahrscheinlich nicht sehr robust Diese Implementierung wird. Es setzt auch voraus, dass auf das Wort ein Leerzeichen folgt und dass es beim Verschieben der Position curX entsprechend handelt.

Ich würde nicht empfehlen, diese Implementierung zu verwenden, wenn ich Sie wäre, aber wahrscheinlich die Funktionen, die benötigt werden, um eine andere Implementierung zu machen, würde immer noch die Methoden von FontMetrics class verwenden.

+0

Danke - Ich begann tatsächlich an einer ähnlichen Methode zu arbeiten, und es gibt eine Reihe von Ähnlichkeiten in unserem Ansatz. Ich füge auch eine Logik hinzu, die den Abstand zwischen Zeichen optimieren kann. –

+0

Das ist großartig. Genau das, was ich gerade brauchte, um in dieser letzten Minute ein Projekt zu beenden. (Kein ernsthaftes Projekt in Produktion) – Tone

+0

@Tone Ich bin froh, ich könnte helfen :) – coobird