Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Instanciation dynamique de 'TextArea' (help !)

6 réponses
Avatar
Debug
Bonsoir ! J'aurais besoin de votre aide, je ne sais vraiment plus quoi
faire...
Je travaille actuellement sur une applet, et j'ai plusieurs questions
relatives aux 'TextArea' (j'utilise Java 1.1, mais je pense que les
questions que je vais poser sont vraiment basiques et je pense que vous
pourrez m'aider).


1) Premier point (le plus simple) : Est-il possible d'instancier un
"TextArea" en spécifiant que le texte contenu sera toujours "centré" à
l'intérieur du composant ? Si oui, comment ? Je n'arrive pas à trouver
comment faire dans la documentation ni dans la FAQ !

2) Second point : au fur et à mesure de l'exécution de l'appel, je n'arrive
pas à redimensionner mon 'TextArea', même en appelant "setColumns( )" et
"setRows( )" : même après ces deux appels, mon 'TextArea' semble toujours
avoir sa taille d'origine, alors que je voudrais le redimensionner au fur et
à mesure...

3) Voilà mon objectif : je voudrais pouvoir avoir un objet "TextArea" global
à mon applet, et je souhaite réaliser les choses suivantes :

- Ne pas afficher le "TextArea" au démarrage de l'applet : actuellement,
j'instancie l'objet dans la méthode "init( )" de mon applet de la manière
suivante :

// Créer la zone de texte
String test = "Si vous voyez ce texte, c'est que tout fonctionne !!";
Texte = new TextArea( test, 2, 15, TextArea.SCROLLBARS_NONE );

// Rendre la zone de texte non-saisissable
Texte.setEditable(false);

// Ajouter la zone de texte
add(Texte);

... si je garde ce code, le 'TextArea' est visible dès le démarrage de
l'applet... or, je ne veux pas qu'il soit visible tout de suite ! J'ai alors
essayé de rajouter au code ci-dessus l'instruction "hide( )" (toujours dans
la méthode "init( )") :

Texte.hide( );

... effectivement, le texte n'apparaît plus au démarrage de l'applet
**MAIS** lorsque plus tard dans l'applet ( au milieu de la méthode
"run( )" ) j'appelle :

Texte.show( );

... le 'TextArea' n'apparaît plus !! La mécanique des multiples "show( )" et
"hide( )" ne semble fonctionner que si je ne cache pas le 'TextArea' dans la
méthode "init( )" !! Le problème, c'est qu'au démarrage de l'applet dans mon
navigateur, on voit mon 'TextArea' pendant quelques fractions de secondes,
et ça c'est cradingue !!... j'espère être assez clair dans l'exposé mon
problème...

- Dans le même contexte : dans ma méthode "init( )", lorsque je crée mon
'TextArea', si je positionne le composant en (0,0) via :
Texte.setLocation(0,0);

... cela n'a aucun effet, et pendant la fraction de seconde pendant laquelle
le composant apparaît au démarrage de l'applet, celui-ci est centré dans
l'application et pas du tout en (0,0)....


POUR RESUMER je voudrais savoir comment :
- instancier proprement un 'TextArea' global à mon applet
- faire en sorte que ce 'TextArea' ne soit pas visible au chargement
- pouvoir afficher ou cacher ce 'TextArea' au fur et à mesure de
l'exécution de l'applet
- pouvoir positionner ce 'TextArea' n'importe où (coordonnées x et y) au
fur et à mesure du déroulement de l'applet...
- pouvoir redimensionner dynamiquement ce 'TextArea' au fur et à mesure
du déroulement de l'applet...


Je vous remercie d'avance pour vos réponses, je ne sais plus quoi
faire...

A++

Debug ;-)

6 réponses

Avatar
tomcat
Debug wrote:
Bonsoir ! J'aurais besoin de votre aide, je ne sais vraiment plus quoi
faire...
Je travaille actuellement sur une applet, et j'ai plusieurs questions
relatives aux 'TextArea' (j'utilise Java 1.1, mais je pense que les
questions que je vais poser sont vraiment basiques et je pense que vous
pourrez m'aider).


1) Premier point (le plus simple) : Est-il possible d'instancier un
"TextArea" en spécifiant que le texte contenu sera toujours "centré" à
l'intérieur du composant ? Si oui, comment ? Je n'arrive pas à trouver
comment faire dans la documentation ni dans la FAQ !


J'ai pas essayé mais ça devrait être ça (d'aprés la javadoc)
Quand tu déclares ton TextArea tu redéfinis la méthode d'alignement :

TextArea ta = new TextArea(){
public float getAlignmentX(){
return java.awt.Component.CENTER_ALIGNMENT;
//ou return 0.5;
});

2) Second point : au fur et à mesure de l'exécution de l'appel, je n'arrive
pas à redimensionner mon 'TextArea', même en appelant "setColumns( )" et
"setRows( )" : même après ces deux appels, mon 'TextArea' semble toujours
avoir sa taille d'origine, alors que je voudrais le redimensionner au fur et
à mesure...


Tu dois probablement oublier de faire des update()

3) Voilà mon objectif : je voudrais pouvoir avoir un objet "TextArea" global
à mon applet, et je souhaite réaliser les choses suivantes :

- Ne pas afficher le "TextArea" au démarrage de l'applet : actuellement,
j'instancie l'objet dans la méthode "init( )" de mon applet de la manière
suivante :

// Créer la zone de texte
String test = "Si vous voyez ce texte, c'est que tout fonctionne !!";
Texte = new TextArea( test, 2, 15, TextArea.SCROLLBARS_NONE );

// Rendre la zone de texte non-saisissable
Texte.setEditable(false);

// Ajouter la zone de texte
add(Texte);

... si je garde ce code, le 'TextArea' est visible dès le démarrage de
l'applet... or, je ne veux pas qu'il soit visible tout de suite ! J'ai alors
essayé de rajouter au code ci-dessus l'instruction "hide( )" (toujours dans
la méthode "init( )") :

Texte.hide( );

... effectivement, le texte n'apparaît plus au démarrage de l'applet
**MAIS** lorsque plus tard dans l'applet ( au milieu de la méthode
"run( )" ) j'appelle :

Texte.show( );

... le 'TextArea' n'apparaît plus !! La mécanique des multiples "show( )" et
"hide( )" ne semble fonctionner que si je ne cache pas le 'TextArea' dans la
méthode "init( )" !! Le problème, c'est qu'au démarrage de l'applet dans mon
navigateur, on voit mon 'TextArea' pendant quelques fractions de secondes,
et ça c'est cradingue !!... j'espère être assez clair dans l'exposé mon
problème...

- Dans le même contexte : dans ma méthode "init( )", lorsque je crée mon
'TextArea', si je positionne le composant en (0,0) via :
Texte.setLocation(0,0);

... cela n'a aucun effet, et pendant la fraction de seconde pendant laquelle
le composant apparaît au démarrage de l'applet, celui-ci est centré dans
l'application et pas du tout en (0,0)....


POUR RESUMER je voudrais savoir comment :
- instancier proprement un 'TextArea' global à mon applet
- faire en sorte que ce 'TextArea' ne soit pas visible au chargement
- pouvoir afficher ou cacher ce 'TextArea' au fur et à mesure de
l'exécution de l'applet
- pouvoir positionner ce 'TextArea' n'importe où (coordonnées x et y) au
fur et à mesure du déroulement de l'applet...
- pouvoir redimensionner dynamiquement ce 'TextArea' au fur et à mesure
du déroulement de l'applet...


Je vous remercie d'avance pour vos réponses, je ne sais plus quoi
faire...

A++

Debug ;-)





Tout ce que je vois là est assez cradingue-> Utilise plutôt des panels
avec un manager.
Au lieu de hide et show, la méthode setVisible(boolean visible) est
meilleure.

Avatar
Debug
Merci beaucoup de ta réponse ! J'ai essayé de mettre tout ça en place, mais
j'ai encore des problèmes... :((

J'ai pas essayé mais ça devrait être ça (d'aprés la javadoc)
Quand tu déclares ton TextArea tu redéfinis la méthode d'alignement :

TextArea ta = new TextArea(){
public float getAlignmentX(){
return java.awt.Component.CENTER_ALIGNMENT;
//ou return 0.5;
});


Suite à ta réponse, j'ai procédé de cette manière :
-------------------------------------------------

Texte = new TextArea( "", // Texte
2, // int rows
15, // int columns
TextArea.SCROLLBARS_NONE ) // int
scrollbars
{
public float getAlignmentX()
{
return java.awt.Component.CENTER_ALIGNMENT;
}
};

add(Texte);


Un peu plus tard, je fais :
--------------------------

Texte.setText("aaa");

... et malheureusement, mon texte n'est pas centré... j'ai fait une erreur
?? As-tu une autre idée ? (je rappelle que je bosse en version 1.1 de Java).


Tu dois probablement oublier de faire des update()


Pour ce qui est du problème de redimensionnement, voici mon code :

Texte.setText("bbb");
Texte.setColumns(5);
Texte.setRows(5);
Texte.repaint();
pause(500);


Texte.setText("ccc");
Texte.setColumns(20);
Texte.setRows(7);
Texte.repaint();
pause(500);


Le compilateur ne veut pas que j'appelle "Texte.update()" comme tu le
suggérais, j'ai donc appelé "Texte.repaint()", mais ça ne change rien au
problème : les textes "bbb" et "ccc" apparaîtssent bien au fur et à mesure
de l'exécution, mais la zone de texte n'est jamais redimentionnée...
Une erreur de ma part ? Des idées ? (je rappelle que je bosse en version 1.1
de Java).

Tout ce que je vois là est assez cradingue-> Utilise plutôt des panels
avec un manager.

Ca existe en version 1.1 ?

Moi au final, tout ce que je voudrais, c'est afficher du texte à l'écran
dans un rectangle, même si ce n'est pas un TextArea, et je voudrais que le
"rectangle" en question soit suffisemment intelligent pour aller à la ligne
lorsqu'une phrase ne tient pas sur une seule ligne...

A++

Debug ;-)

Avatar
tomcat
Re,
J'ai bien réfléchi à ton probléme. J'ai longuement cherché et je l'ai
résolu partiellement. Le temps me manque pour m'y plonger complétement
mais j'ai quelques pistes.

J'avais un problème avec le layoutManager. Avec le BorderLayout et le
FlowLayout mes éléments ne s'affichaient pas comme je le voulais. J'ai
résolu le problème en mettant un GridLayout. La méthode que je t'avais
indiqué pour le centrage n'est adapté que pour des composants et non du
texte. Je pense que tu vas devoir gérer ça à la mimine. Ca ne doit pas
être difficile : un TextListener et c'est parti.
Le redimensionnement, ça va mais un autre problème est apparu. Je te
laisse le soin de le résoudre (ça ne devrait pas trop te poser de
problème non plus). Voici le source de l'applet :


public class MonApplet extends java.applet.Applet
implements java.awt.event.ActionListener
{
private java.awt.TextArea ta;
private java.awt.Button b;
private java.awt.TextField hauteur, largeur;
private java.awt.Panel p;
private java.awt.GridBagLayout gbl;
private java.awt.GridBagConstraints c;

public void init()
{
gbl = new java.awt.GridBagLayout();
p = new java.awt.Panel(gbl);
c = new java.awt.GridBagConstraints();
ta = new java.awt.TextArea("",2,15,java.awt.TextArea.SCROLLBARS_NONE);
ta.setSize(ta.getPreferredSize());
b = new java.awt.Button("Update");
b.addActionListener(this);
hauteur = new java.awt.TextField(2);
largeur = new java.awt.TextField(2);
c.insets = new java.awt.Insets(5,5,5,5);
c.gridx = 0; c.gridy = 0;
c.gridwidth = c.REMAINDER;
c.gridheight = 1;
c.weightx = 0.0; c.weighty = 0.0;
c.fill = c.NONE; c.anchor = c.CENTER;
p.add(ta, c);
c.gridy = 1;
c.gridwidth = 1;
c.weightx = 1.0; c.weighty = 1.0;
p.add(new java.awt.Label("lignes : "), c);
c.gridx = 1;
p.add(hauteur, c);
c.gridx = 2;
p.add(new java.awt.Label("colonnes : "), c);
c.gridx = 3;
p.add(largeur, c);
c.gridx = 4;
p.add(b, c);
add(p);
}

public void actionPerformed(java.awt.event.ActionEvent e)
{
ta.append("Update donen");
int h = Integer.parseInt(hauteur.getText());
int l = Integer.parseInt(largeur.getText());
java.awt.Dimension d = ta.getMinimumSize(h, l);
ta.setRows(h);
ta.setColumns(l);
ta.setSize(d);
repaint();
}

}

@++
Avatar
Debug
Fantastique !! Merci beaucoup pour tout ça !! Ca m'aide vraiment !!
Je vais adapter ton code à mon applet dès que possible, j'espère que tout
fonctionnera !

Je ne sais pas comment fonctionne un "TextListener" pour centrer le texte,
mais je vais me plonger dans la doc' et essayer de trouver ! Je posterai un
nouveau message au besoin ! :)

Le redimensionnement, ça va mais un autre problème est apparu.
Je te laisse le soin de le résoudre (ça ne devrait pas trop te poser
de problème non plus).


... euuuuh... quel autre problème s'il te plaît ?? Je vois pas, là ! :-/

En tout cas, merci infiniment d'avoir passé du temps sur ma question, c'est
vraiment génial !

Debug ;-)


"tomcat" a écrit dans le message de
news:cddo0p$lp6$
Re,
J'ai bien réfléchi à ton probléme. J'ai longuement cherché et je l'ai
résolu partiellement. Le temps me manque pour m'y plonger complétement
mais j'ai quelques pistes.

J'avais un problème avec le layoutManager. Avec le BorderLayout et le
FlowLayout mes éléments ne s'affichaient pas comme je le voulais. J'ai
résolu le problème en mettant un GridLayout. La méthode que je t'avais
indiqué pour le centrage n'est adapté que pour des composants et non du
texte. Je pense que tu vas devoir gérer ça à la mimine. Ca ne doit pas
être difficile : un TextListener et c'est parti.
Le redimensionnement, ça va mais un autre problème est apparu. Je te
laisse le soin de le résoudre (ça ne devrait pas trop te poser de
problème non plus). Voici le source de l'applet :


public class MonApplet extends java.applet.Applet
implements java.awt.event.ActionListener
{
private java.awt.TextArea ta;
private java.awt.Button b;
private java.awt.TextField hauteur, largeur;
private java.awt.Panel p;
private java.awt.GridBagLayout gbl;
private java.awt.GridBagConstraints c;

public void init()
{
gbl = new java.awt.GridBagLayout();
p = new java.awt.Panel(gbl);
c = new java.awt.GridBagConstraints();
ta = new java.awt.TextArea("",2,15,java.awt.TextArea.SCROLLBARS_NONE);
ta.setSize(ta.getPreferredSize());
b = new java.awt.Button("Update");
b.addActionListener(this);
hauteur = new java.awt.TextField(2);
largeur = new java.awt.TextField(2);
c.insets = new java.awt.Insets(5,5,5,5);
c.gridx = 0; c.gridy = 0;
c.gridwidth = c.REMAINDER;
c.gridheight = 1;
c.weightx = 0.0; c.weighty = 0.0;
c.fill = c.NONE; c.anchor = c.CENTER;
p.add(ta, c);
c.gridy = 1;
c.gridwidth = 1;
c.weightx = 1.0; c.weighty = 1.0;
p.add(new java.awt.Label("lignes : "), c);
c.gridx = 1;
p.add(hauteur, c);
c.gridx = 2;
p.add(new java.awt.Label("colonnes : "), c);
c.gridx = 3;
p.add(largeur, c);
c.gridx = 4;
p.add(b, c);
add(p);
}

public void actionPerformed(java.awt.event.ActionEvent e)
{
ta.append("Update donen");
int h = Integer.parseInt(hauteur.getText());
int l = Integer.parseInt(largeur.getText());
java.awt.Dimension d = ta.getMinimumSize(h, l);
ta.setRows(h);
ta.setColumns(l);
ta.setSize(d);
repaint();
}

}

@++


Avatar
tomcat
Debug wrote:
Fantastique !! Merci beaucoup pour tout ça !! Ca m'aide vraiment !!
Je vais adapter ton code à mon applet dès que possible, j'espère que tout
fonctionnera !

Je ne sais pas comment fonctionne un "TextListener" pour centrer le texte,
mais je vais me plonger dans la doc' et essayer de trouver ! Je posterai un
nouveau message au besoin ! :)


Le redimensionnement, ça va mais un autre problème est apparu.
Je te laisse le soin de le résoudre (ça ne devrait pas trop te poser
de problème non plus).



... euuuuh... quel autre problème s'il te plaît ?? Je vois pas, là ! :-/


En fait, le textarea se redimensionne comme prévu mais il passe
au-dessus des autres éléments !
Si ça marche chez toi, c'est surement lié à ma JVM.

En tout cas, merci infiniment d'avoir passé du temps sur ma question, c'est
vraiment génial !


De rien. Si tu veux des commentaires sur le code, n'hésite pas.

@++


Avatar
Debug
Ah oui, effectivement le TextArea passe par-dessus les autres éléments, mais
en l'occurrence ça ne me gêne pas pour ce que je veux faire ! :))

Merci encore ! Je te recontacterai si j'ai des soucis avec le code, merci !
:))

A++

Debug ;-)