OVH Cloud OVH Cloud

Focusable JPanel

4 réponses
Avatar
Olivier Pierrier
Bonjour à tous,

J'ai le problème suivant : un JPanel(A) contient un JLabel, des CheckBox
et divers JTextComponent.

Je souhaite pouvoir ajouter un FocusListener à A. le problème c'est que
si un des autes composants inclus est focusable, je ne recois pas
d'évènement.

Une solutions serait de faire que A soit FocusListener de tous des
enfants, mais ca me semble un peu lourd comme solution.

Merci pour vos solutions/commentaires/idées

Olivier

ps :
http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html#trackingFocus
n'apporte pas de solution à mon problème.

4 réponses

Avatar
jocelyn
Salut !
Il me semble que par defaut les JPanel ne recoivent pas le focus car leur
propriete focusable est a false.
Donc il te faut deja faire un monPanneau.setFocusable(true) pour que le
listener que tu mettras dessus soit
d'une quelconque utilite.

"Olivier Pierrier" a écrit dans le message news:
c0d2i0$15i1q3$
Bonjour à tous,

J'ai le problème suivant : un JPanel(A) contient un JLabel, des CheckBox
et divers JTextComponent.

Je souhaite pouvoir ajouter un FocusListener à A. le problème c'est que
si un des autes composants inclus est focusable, je ne recois pas
d'évènement.

Une solutions serait de faire que A soit FocusListener de tous des
enfants, mais ca me semble un peu lourd comme solution.

Merci pour vos solutions/commentaires/idées

Olivier

ps :

http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html#trackingFocu

s
n'apporte pas de solution à mon problème.


Avatar
Olivier Pierrier
Salut,

jocelyn wrote:

Salut !
Il me semble que par defaut les JPanel ne recoivent pas le focus car leur
propriete focusable est a false.
Donc il te faut deja faire un monPanneau.setFocusable(true) pour que le
listener que tu mettras dessus soit
d'une quelconque utilite.



C'est déjà fait, le problème est que si monPanneau contient un
JTextField(JT), monPanneau ne génère pas d'évènement quand Jt perd le
focus pour un Composant externe à monPanneau, c'est ce que je
souhaiterai :

-------------------------------------
- panneau A -
-------------------------------------
-------------------------------------
- panneau B -
- -------------------------------- -
- - TextField T - -
- -------------------------------- -
-------------------------------------

Probleme : T à le focus, je clique sur A, B ne génère pas de focusLost

Olivier

Avatar
Sébastien BALLET
Salut

"Olivier Pierrier" a écrit dans le message de news:
c0d5rv$15aa8i$
Salut,

jocelyn wrote:

Salut !
Il me semble que par defaut les JPanel ne recoivent pas le focus car
leur


propriete focusable est a false.
Donc il te faut deja faire un monPanneau.setFocusable(true) pour que le
listener que tu mettras dessus soit
d'une quelconque utilite.



C'est déjà fait, le problème est que si monPanneau contient un
JTextField(JT), monPanneau ne génère pas d'évènement quand Jt perd le
focus pour un Composant externe à monPanneau, c'est ce que je
souhaiterai :

-------------------------------------
- panneau A -
-------------------------------------
-------------------------------------
- panneau B -
- -------------------------------- -
- - TextField T - -
- -------------------------------- -
-------------------------------------

Probleme : T à le focus, je clique sur A, B ne génère pas de focusLost



Si tu bosses avec un JDK < 1.4, j'ai pas de solution en tête. Par contre, Si
tu bosses avec un JDK >= 1.4, tu as
la méthode FocusEvent.getOppositeComponent() qui permet d'obtenir le
composant :
* ayant perdu le focus dans le cas d'un FOCUS_GAINED
* ayant obtenu le focus dans le cas d'un FOCUS_LOST


A+

Seb


Avatar
Olivier Pierrier
Salut,

-------------------------------------
- panneau A -
-------------------------------------
-------------------------------------
- panneau B -
- -------------------------------- -
- - TextField T - -
- -------------------------------- -
-------------------------------------




Si tu bosses avec un JDK < 1.4, j'ai pas de solution en tête. Par contre, Si
tu bosses avec un JDK >= 1.4, tu as
la méthode FocusEvent.getOppositeComponent() qui permet d'obtenir le
composant :
* ayant perdu le focus dans le cas d'un FOCUS_GAINED
* ayant obtenu le focus dans le cas d'un FOCUS_LOST



Ca semble la solution la plus simple effectivement, je vais donc faire
de la facon suivante,
un listener(Component, hierarchie, je sais plus ) sur b pour choper tous
ces enfants,
a chaque enfant focusable ajouter un focus listener
et verifier si le focus entre/sort de facon generale dans B avec la
methode FocusEvent.getOppositeComponent.

Je devrais obtenir l'effet souhaiter, mais n'empeche que ca fais
beaucoup de listeners et d'instance pour une fonctionalite qui me semble
basique.

Merci a tous,

Olivier.