[JMenuBar] Perdre la sélection/le focus [Résolu]

Messages postés
8
Date d'inscription
vendredi 24 février 2012
Dernière intervention
15 mars 2012
- - Dernière réponse : Froxil
Messages postés
8
Date d'inscription
vendredi 24 février 2012
Dernière intervention
15 mars 2012
- 15 mars 2012 à 11:51
Bonjour,

Afin de connaître les interfaces graphiques dans java, je me suis lancé dans un bête jeu 2D où le joueur doit se servir des flèches directionnelles (ou la souris) pour faire bouger son personnage sur une carte.

Afin d'éviter de relancer le jeu à chaque fin de partie, j'ai décidé d'ajouter un JMenuBar à ma fenêtre principale dans lequel on peut trouver un item "nouvelle partie", un item "options" et un item "règles".

Lorsqu'on clique dessus, tout se passe bien. Seulement, lorsqu'on recommence à jouer, à moins de cliquer dans la partie principale de la fenêtre, on voit la sélection passer sur les différents item du menu (en même temps que le pion bouge sur la carte).

Afin que le pion puisse se déplacer directement après avoir cliqué sur l'item "nouvelle partie", j'utilise la fonction transferFocus() et afin que l'item ne soit plus sélectionné, je fais un setSelected(false). Mais ceci ne change rien au problème ! J'ai essayé avec un removeNotify(), mais dans ce cas, on ne peut faire qu'une seule nouvelle partie, ensuite, ce n'est plus faisable.

Avez vous une idée pour résoudre ceci ?

Je ne sais pas si j'ai été clair sur ce que je veux faire et mes problèmes, si tel n'est pas le cas, veuillez m'en excuser.

Cordialement,

Froxil
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
8
Date d'inscription
vendredi 24 février 2012
Dernière intervention
15 mars 2012
3
Merci
Bon, j'ai trouvé une astuce pour y arriver, mais vraiment pas propre du tout (du moins, à mon sens) : c'est de redéfinir un nouveau JMenuBar dans lequel je remet mes JMenu (et les désélectionner, bien entendu)...

Si quelqu'un sait comment faire pour éviter cela de manière plus propre, je suis preneur ! Car là, ça va que je n'ai pas beaucoup de JMenu, j'en aurais plus, ce ne serait pas gérable ! ^^

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Froxil
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
272
0
Merci
Bonjour,

Oui, je vois ce qui te poses problème. Il faut que tu ais le focus sur ton composant qui te permet de jouer.

Je crois que souvenir que tu peux utiliser la méthode requestFocusInWindow pour récupérer le focus sur un composant.
Commenter la réponse de cs_Julien39
Messages postés
8
Date d'inscription
vendredi 24 février 2012
Dernière intervention
15 mars 2012
0
Merci
Merci pour la rapidité de réponse.

Oui, j'avais oublié : j'avais déjà essayé de faire un requestFocus() sur le composant qui permet de jouer, ce qui devrait revenir au même (à ceci près que c'est moins propre) que le requestFocusInWindow(). Malheureusement, ni l'un ni l'autre ne fonctionne, le problème persiste.

Désolé de ne pas vous montrer les codes, car comme c'est pour essayer l'interface graphique, j'ai codé à l'arrache, mes codes sont limites pas lisible : très peu de commentaires (ce qui n'est pas mon habitude ^^), parfois répétition de code dans différentes fonctions au lieu d'en faire une fonction, etc... J'en ai presque honte !
Commenter la réponse de Froxil
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
272
0
Merci
Attends, j'avais fait ca sur un projet, je vais essayer de le retrouver.

Ce n'est pas grave pour le code, de toute façon, je vois très bien quel est ton problème.
Commenter la réponse de cs_Julien39
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
272
0
Merci
Verdict : j'ai utilisé les deux : requestFocus et requestFocusInWindow et ca marche.

Le fonctionnement ne me parait pas top mais ca tourne.

Par contre, attention, il ne faut pas que tu modifies l'objet après avoir fait la demande de focus sinon, ca ne marche pas.

J'ai testé avant de te le confirmer et ca marche :

	public static void main(String[] args){
JFrame test = new JFrame();
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

test.setLayout(new GridLayout(2, 2));
test.add(new JTextField());
JTextField f = new JTextField();
test.add(f);
test.add(new JTextField());
test.add(new JTextField());

test.setSize(200, 200);
test.setLocationRelativeTo(null);
test.setVisible(true);
f.requestFocus();
f.requestFocusInWindow();
}
Commenter la réponse de cs_Julien39
Messages postés
8
Date d'inscription
vendredi 24 février 2012
Dernière intervention
15 mars 2012
0
Merci
Ça marche à l'ouverture de la fenêtre oui...

Cependant, dans mon cas, ça ne fonctionne pas : lorsque je clique sur "nouvelle partie", seul le JPanel qui contient la "carte du jeu" est actualisé... Si je clique dedans, il n'y a aucun souci, tout se passe bien, seulement, si je ne clique pas dedans, même si mon personnage bouge grâce aux touches directionnelles, on voit les différents item du JMenuBar se sélectionner... :(
Commenter la réponse de Froxil
Messages postés
8
Date d'inscription
vendredi 24 février 2012
Dernière intervention
15 mars 2012
0
Merci
En affichant "isFocusOwner()" sur la carte, il s'avère qu'elle dispose bien du Focus (et donc le menu ne l'a plus)... Cependant, le problème d'affichage est toujours là : les JMenu se sélectionnent les uns après les autres lorsque j'appuie sur les flèches gauche et droite après avoir cliqué sur le JMenu "Nouvelle Partie", alors qu'avant, non... Donc le problème ne semble pas venir du focus.

Je ne vois pas du tout d'où il vient ! J'ai essayé de désélectionner et de désarmer le JMenu "Nouvelle Partie", rien n'y change... :(
Commenter la réponse de Froxil
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
272
0
Merci
Et tu as essayé d'appeler un doClick sur un autre objet ?

(Pas génial comme solution mais ca peut marcher )
Commenter la réponse de cs_Julien39
Messages postés
8
Date d'inscription
vendredi 24 février 2012
Dernière intervention
15 mars 2012
0
Merci
J'y avais pensé, mais mis à part mes JMenu (et le JMenuBar), je n'ai aucun composant qui implémentent une interface ou étendent une classe qui permettent d'appeler un doClick()...

Dans tous les cas, ce n'est pas très grave, tout fonctionne en dehors de ça, le mini jeu que j'ai fait est donc opérationnel, il n'y a que ce petit détail graphique qui terni un peu le tout... Le but est donc réussi, apprendre un peu swing ! Mais j'aimerais bien enlever quand ce %#@*$? de bug ! :P
Commenter la réponse de Froxil

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.