L'obtention de la chaîne de taille en java (sans avoir un objet Graphique est disponible)
Je suis en train d'écrire des applications qui ont besoin de tirer un grand nombre de chaînes à l'aide de la classe Graphics2D en Java. J'ai besoin d'obtenir des tailles de chaque objet de type String (pour calculer la position exacte de chaque chaîne).
Il y a tellement de chaînes qu'il devrait être fait avant la peinture() la méthode est appelée et qu'une fois au début de mon programme (alors je n'ai pas d'objet Graphics2D encore). Je sais qu'il existe une méthode Police.getStringBounds (), mais il a besoin d'un FontRenderContext objet en tant que paramètre.
Quand j'ai essayé de créer mon propre objet:
FontRenderContext frc = new FontRenderContext(MyFont.getTransform(), true, true)
et obtenir ensuite les chaînes de limites, j'ai toujours obtenir les différentes tailles que lorsque je obtenir FontRenderContext à l'aide de Graphics2D.getFontRenderContext() méthode paint() de la méthode. Les différences ne sont pas grandes (environ 1E-3), mais je me demande pourquoi il y a une différence?
Cependant, est-il meilleur et sûr moyen d'obtenir des tailles d'une chaîne de caractères?
Thnx pour toute aide à l'avance!
OriginalL'auteur Lukasz Spas | 2011-02-06
Vous devez vous connecter pour publier un commentaire.
Essayer avec le FontMetrics classe; la stringWidth méthode retourne la taille d'une chaîne.
Un exemple:
OriginalL'auteur Alberto
Vous pourriez également vouloir vérifier
SwingUtilities.computeStringWidth
.OriginalL'auteur Jochen Bedersdorfer
Nev-ah. Va. Se produire.
La raison en est que le rendu et du calcul, vous êtes à la recherche pour de FRC est spécifique à un contexte Graphique, c'est à dire un spécifique Graphics2D objet. Celui que vous êtes intéressé à vous est remis au moment de l'exécution - c'est pas comme les autres (vous avez à assumer).
Vous pouvez calculer autant que vous le souhaitez à l'aide d'un COMITÉ d'examen de certains autres Graphics2D, mais vos calculs de tous les tous les pour rien quand vous essayez de les utiliser lors de l'exécution avec les Graphics2D paintComponent est remis, qui est le Graphics2D vous allez utiliser, n'importe quoi.
Donc, oui, ce serait sympa, mais il est tout à fait théorique. Tout ce que nice l'information est effectivement enfermé à l'intérieur que la FRC, car sans l'exacte Graphics2D la AttributedString est en fait va être attiré par des, que la FRC est pire qu'inutile - c'est une illusion que vous pourriez essayer de l'embrasser.
Cela a du sens, puisque tout dépend de la Graphics2D vous me remis au moment de l'exécution. Donc, la meilleure chose à faire est de l'accepter et d'écrire votre code pour appeler à partir de l'intérieur paintComponent à ce que les objets et quelle que soit spécialisé calcul que vous avez à faire et de construire votre conception sur le fait que C'est la façon dont les choses sont.
J'ai est une bonne question et une bonne chose que vous pourriez faire, simplement, vous ne pouvez pas. Vous voyez d'autres personnes qui demandent de la présente ailleurs sur le web, dans d'autres forums. Constater l'absence de réponses utiles et /ou un silence assourdissant.
OriginalL'auteur Swing God
Voici un extrait de code qui fait la même chose -- écrit pour abréger la chaîne en un nombre donné de pixels.
Eh bien.. les propriétés de Graphics2D instance peut être différente sur le cycle de vie de l'application. Comme vous l'avez fait tout à fait correctement, il faut prendre en compte "l'anti-aliasing et d'autres fonctions", ce qui n'est pas possible sans une instance spécifique de Graphics2D.
OriginalL'auteur 01es
Outre l'utilisation de FontMetrics, un JLabel peut être utilisé pour déterminer la taille des deux sans mise en forme et de base (HTML) texte rendu. Ici est un exemple.
Edit 1:
Quant à votre "beaucoup de cordes" commentaire. Peindre les chaînes à une BufferedImage qui n'est régénérée en cas de besoin. Utiliser le BufferedImage chaque fois paintComponent() est appelée.
OriginalL'auteur Andrew Thompson
pour les historiques de souci,voici comment je pense qu'il a fait à l'origine (jruby java pseucodoe)
OriginalL'auteur rogerdpack