[JAVA 2D] Redimensionner la taille d'un composant en fonction du texte

Redimensionner la taille d'un composant en fonction du texte [JAVA 2D] - Java - Programmation

Marsh Posté le 05-04-2004 à 16:02:15    

Salut,
 
Voila mon probleme:
 
Je cherche a utiliser dans une JFrame des composants tout bete (descendant de JComponent donc),des petits rectangles destinés a contenir un mot.
 
Seulement, voila, je voudrais que la taille des composants dépende du texte qu'ils hébergent.
 
Pour cela, j'avais l'idée d'utiliser des méthodes du genre Font.getStringBounds(myString, frc), frc étant du type FontRenderContext.
 
Seulement, pour obtenir mon FontRenderContext, j'ai besoin de faire un appel du genre g2.getFontRenderContext, g2 étant du type Graphics2D, cad le contexte graphique de mon composant.
 
Seulement, voila, le seul endroit ou il me semble pouvoir y accéder est la méthode PaintComponent, qui est appelée chque fois que le composant a besoin d'etre redessiné... Tout la est mon probleme: une fois que mon composant est bien dimensionné, quel est lintéret de refaire tous ces calculs? Ne pourrais je pas faire ces calculs une seule fois au lieu de les faire a chaque rafraichissement?
 
Comment faire?

Reply

Marsh Posté le 05-04-2004 à 16:02:15   

Reply

Marsh Posté le 05-04-2004 à 16:17:09    

FontMetrics, je connais cette classe de nom et elle doit avoir un rapport avec la choucroute.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 05-04-2004 à 16:52:02    

nraynaud a écrit :

FontMetrics, je connais cette classe de nom et elle doit avoir un rapport avec la choucroute.


 
Ca m'a l'air pas mal, ca me permettrait d'obtenir la largeur et la longueur des mes chaines de caracteres, sans avoir a spécifier de contexte graphique.
 
Sinon, mon ultime recours aurait été de faire les calculs lors du premier appel a PaintComponent et ensuite d'enregistrer les resulats dans dans des données membre et de mettre un booléen "Sized" a true. Mais pas tres tres propre...
 
Je vais essayer avec la classe fontMetrics alors!
 
Merci!!

Reply

Marsh Posté le 05-04-2004 à 18:04:32    

Yoyo@ a écrit :

Salut,
Seulement, pour obtenir mon FontRenderContext, j'ai besoin de faire un appel du genre g2.getFontRenderContext, g2 étant du type Graphics2D, cad le contexte graphique de mon composant.
 
Seulement, voila, le seul endroit ou il me semble pouvoir y accéder est la méthode PaintComponent, qui est appelée chque fois que le composant a besoin d'etre redessiné... Tout la est mon probleme: une fois que mon composant est bien dimensionné, quel est lintéret de refaire tous ces calculs? Ne pourrais je pas faire ces calculs une seule fois au lieu de les faire a chaque rafraichissement?
 
Comment faire?

http://java.sun.com/j2se/1.4.2/doc [...] Graphics() devrais faire l'affaire si tu hérites de JComponent.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 06-04-2004 à 10:28:09    

nraynaud a écrit :

FontMetrics, je connais cette classe de nom et elle doit avoir un rapport avec la choucroute.


 
Je viens de regarder cette classe FontMetrics, et franchement, ca ne me parait pas simple non plus.
 
Déja, cette classe est abstraite (et son constructeur est protected), donc, je suis obligé de créer une classe dérivée (avec une InnerClass par exemple).
 
Ensuite, quand j'essaie un truc tout bete du genre :
 

Code :
  1. Font font = new Font("Arial", Font.PLAIN, 10);
  2.         class myMetrics extends FontMetrics{
  3.   myMetrics(Font ft){
  4.     super(ft);
  5.   }
  6. }
  7. myMetrics ftm = new myMetrics(font);
  8. System.out.println(ftm.stringWidth("Bonjour" ));


 
J'obtiens un magnifique java.lang.StackOverflowError...

Reply

Marsh Posté le 06-04-2004 à 12:17:45    

Bon, je commence un peu mieux a comprendre:
 
Pour calculer la largeur de ma String, il me faut un contexte graphique, et ce contexte graphique, je ne peux l'obtenir qu'une fois que les JComponent ont été rendus visibles.
 
Alors, j'utilise mon contexte graphique, je calcule alors les largeurs nécessaires, et je redimensionne mes composants en fonction.
 
Bien ur, je dois faire ca dans le Event Dispatching Thread, donc, je dois utiliser un appel avec un InvokeLater...
 
Voila ce que je déduis de tout ca.
 
Si vous avez des commentaires, ou que vous trouver cela maladroit, dites le moi :)

Reply

Marsh Posté le 06-04-2004 à 12:19:32    

Heu moi j'ai une remarque : tu veux faire un composant qui affiche du texte. T'as essayé le JLabel ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 06-04-2004 à 12:24:16    

En fait, pour le moment, je mets une petite chaine de caractere, mais par la suite, je voudrais peut etre personnaliser un petit peu (par exemple, avoir plusieurs lignes de texte), et pouvoir le bouger a la souris.
 
Donc, je préférais créer mon propre composant des le début.
 
Merci du conseil.
 
Je pense que le JLabel serait vite limité, meme si je peux, il me semble, mettre plusieurs lignes de texte a l'intérieur, grace a du HTML.
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed