[JMenuBar] Perdre la sélection/le focus

Résolu
Froxil Messages postés 8 Date d'inscription vendredi 24 février 2012 Statut Membre Dernière intervention 15 mars 2012 - 14 mars 2012 à 11:07
Froxil Messages postés 8 Date d'inscription vendredi 24 février 2012 Statut Membre 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

9 réponses

Froxil Messages postés 8 Date d'inscription vendredi 24 février 2012 Statut Membre Dernière intervention 15 mars 2012 1
15 mars 2012 à 11:51
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 ! ^^
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
14 mars 2012 à 11:52
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.
0
Froxil Messages postés 8 Date d'inscription vendredi 24 février 2012 Statut Membre Dernière intervention 15 mars 2012 1
14 mars 2012 à 12:16
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 !
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
14 mars 2012 à 13:26
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
14 mars 2012 à 13:38
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();
}
0
Froxil Messages postés 8 Date d'inscription vendredi 24 février 2012 Statut Membre Dernière intervention 15 mars 2012 1
14 mars 2012 à 20:42
Ç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... :(
0
Froxil Messages postés 8 Date d'inscription vendredi 24 février 2012 Statut Membre Dernière intervention 15 mars 2012 1
14 mars 2012 à 21:18
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... :(
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
15 mars 2012 à 08:39
Et tu as essayé d'appeler un doClick sur un autre objet ?

(Pas génial comme solution mais ca peut marcher )
0
Froxil Messages postés 8 Date d'inscription vendredi 24 février 2012 Statut Membre Dernière intervention 15 mars 2012 1
15 mars 2012 à 11:32
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
0
Rejoignez-nous