SetFocus() et TextField

Uncle_BuZZ Messages postés 4 Date d'inscription jeudi 5 août 2004 Statut Membre Dernière intervention 30 août 2004 - 30 août 2004 à 14:54
Uncle_BuZZ Messages postés 4 Date d'inscription jeudi 5 août 2004 Statut Membre Dernière intervention 30 août 2004 - 30 août 2004 à 17:29
Bonjour !

J'ai un problème avec les focus...

Je m'explique :

J'ai une applet (tout en AWT) dans laquel j'ai plusieurs Panel qui apparaissent suivant certains évenement...

Dans l'un d'eux, lorsque je double clique sur un label, un Textfield apparait à la place du Label.

Jusque là tout se passe bien. Mais je veux qu'au moment où apparait le TextField, le curseur se positionne à l'intérieur de celui-ci pour qu'on puisse l'éditer immédiatemetn sans l'avoir sélectionné.

A priori si j'ai bien compris la chose, il s'agit de lui donner le Focus, et ceci est cencé être possible avec la fonction setFocus();

Ensuite lorsque j'enlève le Focus de ce TextField (quand je suis cencé avoir finit de l'éditer), il doit disparaitre pour laisser à nouveau sa place au Label mis à jour.

J'utilise un FocusListener sur ce TextField pour voir à quel moment l'effacer et afficher le Label.

Mon problème est le suivant :
A l'apparition du TextField, celui-ci prend le Focus puis le perd instantanément, ce qui fait qu'il disparait et son édition est impossible.

Voici des extraits de code qui pourront j'espère vous permettre de me guider :

La classe du TextField modifiée :

(Sous_Cadre est une classe de Panel modifiée dans laquelle j'ajoute ce type de TextField, je l'ajoute ici pour me permettre de lancer la fonction update_label() de ce Panel)

private class TextField_Boolean extends TextField implements FocusListener
{
public boolean bool;
public Sous_Cadre parent;

public TextField_Boolean(String text,Sous_Cadre SC)
{
super(text);
bool = false;
parent = SC;
this.addFocusListener(this);
}

public void focusGained(FocusEvent e)
{
this.selectAll();
}

    public void focusLost(FocusEvent e)
    {
    	bool = false;
    	parent.update_label();
    }
}


Un extrait de update_label() :
(Suivant la valeur du boolean de mon objet de la classe précédente, j'affiche soit le Label correspondant, soit le TestField qui me permet de changer sa valeur)

(...)
x = 10;
if(T_longueur.bool)
{
this.add(T_longueur,x,22,30,hauteur_texte()+4);
T_longueur.requestFocus();
x += T_longueur.getWidth();
}
else
{
remove(T_longueur);
LH[0] = new Label_Highlight(T_longueur.getText()+" ",T_longueur,Color.magenta);
add_Label_Highlight(LH[0],
x,
24,
metrics.stringWidth(LH[0].getText()),
hauteur_texte());
x += metrics.stringWidth(LH[0].getText());
LH[0].addMouseListener(this);
}
(...)


Les caractéristique du TextField sont définit dans le constructeur du Panel qui le contient, ensuite je ne fais que jouer avec "add()" et "remove()" pour le placer ou l'enlever.

J'affiche par la suite d'autres Label avant de laisser la main à l'utilisateur, mais je les ai désactivés pour voir si ils pouvaient "voler" le Focus du TextField mais ca ne changeait rien, donc je suppose qu'ils ne sont pas en cause;

Au final, j'ai une ligne de texte sous forme de plusieurs Label juxtaposés, dont certains sont cliquable (comme un lien html) et laissent apparaitre chacun leur tour (en raison de la perte de Focus qui les fait disparaitre, c'est fait expres pour n'avoir qu'un seul TextField à la fois) un TextField pour modifier la valeur du Label concerné.

Mais donc j'ai ce problème de Focus que je n'arrive pas à maitriser...

3 réponses

Uncle_BuZZ Messages postés 4 Date d'inscription jeudi 5 août 2004 Statut Membre Dernière intervention 30 août 2004
30 août 2004 à 14:57
EDIT : requestFocus au lieu de setFocus, cf le code joint ;)
0
Uncle_BuZZ Messages postés 4 Date d'inscription jeudi 5 août 2004 Statut Membre Dernière intervention 30 août 2004
30 août 2004 à 15:00
EDIT : j'ai oublié de dire que si je ne met pas le requestFocus, le TextField ne prend pas le focus, et donc ne disparait pas tout seul, mais je perd ce que je veux faire, c'est à dire donner le focus au TextField automatiquement.
0
Uncle_BuZZ Messages postés 4 Date d'inscription jeudi 5 août 2004 Statut Membre Dernière intervention 30 août 2004
30 août 2004 à 17:29
J'ai réussi en mettant aussi un requestFocus() sur le Panel qui contient le TextField...

Apparament, il y a plusieurs niveau de Focus, un niveau pour les container, puis un niveau pour les objets de ce container... Corrigez moi si je me trompe.
0
Rejoignez-nous