Justification complète avec un graphique Java.Remplacement de cordon?
Quelqu'un connaît-il du code existant qui vous permet de dessiner du texte entièrement justifié dans Java2D?
Par exemple, si je disais, drawString("sample text here", x, y, width)
, existe-t-il une bibliothèque existante qui pourrait déterminer la quantité de ce texte dans la largeur, faire un espacement entre les caractères pour que le texte soit beau et faire automatiquement un habillage de mot de base?
2 answers
Bien que pas le plus élégant, ni solution robuste, voici une méthode qui va prendre le Font
de l'actuel Graphics
objet et obtenir son FontMetrics
afin de savoir où tracer le texte, et, si nécessaire, passer à une nouvelle ligne:
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;
}
}
Cette implémentation séparera le String
donné en un tableau de String
en utilisant le split
méthode avec un caractère d'espace comme seul séparateur de mots, donc ce n'est probablement pas très robuste. Il suppose également que le mot est suivi d'un caractère d'espace et agit en conséquence lors du déplacement de la position curX
.
Je ne recommanderais pas d'utiliser cette implémentation si j'étais vous, mais probablement les fonctions nécessaires pour faire une autre implémentation utiliseraient toujours les méthodes fournies par le FontMetrics
classe.
Pour l'habillage de mots, vous pourriez être intéressé par Comment afficher une chaîne sur plusieurs lignes à l'aide de graphiques. Pas de justification ici, pas sûr que ce soit facile (ou impossible!) ajouter...