Giustificazione completa con una sostituzione Java Graphics.drawString?
Domanda
Qualcuno conosce il codice esistente che ti consente di disegnare testo pienamente giustificato in Java2D?
Ad esempio, se dicessi, drawString (" testo di esempio qui " ;, x, y, larghezza)
, esiste una libreria esistente che potrebbe capire quanto di quel testo si adatta al larghezza, fai un po 'di spaziatura tra i caratteri per far apparire bene il testo e automaticamente avvolgere le parole di base?
Soluzione
Sebbene non sia la soluzione più elegante né robusta, ecco un metodo che prenderà Font
dell'attuale Graphics
e ottiene il suo oggetto FontMetrics
per scoprire dove disegnare il testo e, se necessario, passare a una nuova riga:
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;
}
}
Questa implementazione separerà il String
in una matrice di String
usando split
con un carattere spaziale come unico separatore di parole , quindi probabilmente non è molto robusto. Presuppone inoltre che la parola sia seguita da un carattere spazio e agisca di conseguenza quando si sposta la posizione curX
.
Non consiglierei di utilizzare questa implementazione se fossi in te, ma probabilmente le funzioni necessarie per effettuare un'altra implementazione utilizzerebbero comunque i metodi forniti da FontMetrics
class .
Altri suggerimenti
Per la parola a capo, potresti essere interessato dal titolo Come produrre una stringa su più linee usando Grafica . Nessuna giustificazione qui, non sono sicuro se sia facile (o impossibile!) Aggiungere ...