IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Panel et Focus


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut Panel et Focus
    Bonjour,

    J'ai un problème avec la gestion de l'ecouteur clavier (KeyListener) ou plus exactement avec le focus de mon composant Panel.

    voici la structure de ma fenetre principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Princ extends Frame{
     
    	private Panel Desk = new Panel(new BorderLayout());
    	private Panel Desk_Center = new Mon_Panel(...);
    	private Info_Bar Info = new Info_Bar();
     
    	public Princ(...) {
    		super(...);
     
    		Desk.add(Desk_Center, BorderLayout.CENTER);
    		Desk.add(Info, BorderLayout.SOUTH);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public class Mon_Panel extends Panel implements KeyListener, FocusListener{
     
    	public Mon_Panel() {
    		super();
     
    		this.addKeyListener(this);
    		this.addFocusListener(this);
     
    		requestFocus();	//ask the focus
    	}
     
    	public void keyPressed(KeyEvent arg0) {
    		System.out.println("1_" + arg0.getKeyChar());
    		//VK_DOWN
     
    	}
     
    	public void keyReleased(KeyEvent arg0) {
    		System.out.println("2_" + arg0.getKeyChar());
     
    	}
     
    	public void keyTyped(KeyEvent arg0) {
    		System.out.println("3_" + arg0.getKeyChar());
     
    	}
     
    	public void focusGained(FocusEvent arg0) {
    		System.out.println("getfocus");
     
    	}
     
    	public void focusLost(FocusEvent arg0) {
    		System.out.println("lostfocus");
     
    	}
    }
    le problème c'est que le Panel "Mon_Panel" n'a jamais le focus (les messages "getfocus" et "lostfocus" n'apparaissent jamais.

    donc l'ecouteur clavier ne recoit aucun evenement.

    si je deplace mes ecouteurs sur le Frame (Princ) tout fonctionne correctement.

    Ma question est: comment faire pour que le Panel recoive le focus au lieu du frame? j'aimerai gerer les evenements clavier dans la classe "Mon_Panel".

    Merci de votre aide.

  2. #2
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Hello,

    D'abord quelques commentaires sur ton code. C'est illisible.
    Tu ne devrais pas nommer tes classes et instances comme ça.
    Normalement un nom de classe doit être de la forme ^[A-Z][a-zA-Z0-9]*$ et une instance de la forme ^[a-z][a-zA-Z0-9_]*$ . La différence majuscule/minuscule de la première lettre permettant de faire la différence justement.

    Voici comment moi je fais pour récupérer un appui sur la touche F9 dans un JPanel =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Add action map
    InputMap inputMap = m_panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.getKeyText(KeyEvent.VK_F9)), "F9");
    panel.getActionMap().put("F9", new F9Action());
    JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT permet de capturer le focus hiérarchiquement. Il y a d'autres options selon comment tu veux traiter le focus.

    ++
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    Je travail en AWT et pas en Swing.

    merci pour ta reponse je prends note de ton commentaire sur les noms de class et instances.

    Quelqu'un à une solution avec AWT?

  4. #4
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Dans ce cas, tu peux peut-être t'en sortir avec un AWTEventListener ? Il reçoit tous les événements, à toi de tester si ils sont destinés à un composant qui est contenu dans le Panel.

    Sinon, c'est normal que le Panel ne reçoive pas le focus, la méthode isFocusable() renvoie false. Tu peux le rendre focusable, mais je ne sais pas si ça aura le comportement que tu recherches.

    Enfin, ta dernière phrase m'a mis le doute : tu veux gérer dans la classe Mon_Panel les événements de la Frame ? Pas compliqué, tu fais en sorte que ton Panel écoute ta Frame (maFrame.addKeyListener(monPanel);). Mais sache que cela ne marchera pas si c'est un autre composant que ta Frame qui a le focus (un TextField, un Button, un Machin, etc..)
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

Discussions similaires

  1. Problème de focus dans un panel
    Par Scots dans le forum ASP.NET
    Réponses: 9
    Dernier message: 30/09/2011, 18h29
  2. [SWING]jTable + Focus
    Par chady dans le forum Composants
    Réponses: 5
    Dernier message: 27/02/2003, 14h51
  3. Comment être sure que mon appli prenne le focus ?
    Par AmaX dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/12/2002, 15h00
  4. Créer une fenêtre flottante qui ne peut avoir le focus
    Par BestofMac dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 10h46
  5. focus en C
    Par killpilot dans le forum C
    Réponses: 8
    Dernier message: 19/04/2002, 19h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo