2010-10-04 10 views
0

J'ai un JFrame avec 3 panneaux. J'adresse une classe App, puis ajoutez trois panneaux à elle, comme ceci:Java - JPanel et KeyListener Problème

JPanel controlButtonsPanel = new GameControlButtons(); 
     controlButtonsPanel.setPreferredSize(new Dimension(801,60)); 
     controlButtonsPanel.setBorder(new LineBorder(Color.white, 1)); 
     constraints.anchor = GridBagConstraints.NORTHWEST; 
     constraints.weightx = 2; 
     constraints.weighty = 0.3; 
     this.add(controlButtonsPanel, constraints); 

     JPanel tempP = new JPanel();  
/`/ *** I'm going to create a Jpanel subclass for this, too, I just haven't yet.` 
     tempP.setPreferredSize(new Dimension(500,838)); 
     tempP.setBorder(new LineBorder(Color.white, 2)); 
     constraints.anchor = GridBagConstraints.NORTHEAST; 
     constraints.weightx = 1; 
     constraints.weighty = 2; 
     this.add(tempP, constraints); 

     JPanel graphicsPanel = new RoofRunnerGame("Ken"); 
     constraints.anchor = GridBagConstraints.SOUTHWEST; 
     constraints.weightx = 2; 
     constraints.weighty = 1; 
     graphicsPanel.setBorder(new LineBorder(Color.white, 1)); 
     graphicsPanel.setPreferredSize(new Dimension(800,800)); 
     graphicsPanel.requestFocus(); 
     this.add(graphicsPanel, constraints);  

J'ai JPanel étendu pour les GameControlButtons et les classes de RoofRunnerGame. J'ai ajouté un mouselistener à l'ancien. Et j'ai ajouté un écouteur souris et un écouteur clé à ce dernier.

** Le problème:. Les auditeurs de souris fonctionnent très bien pour les deux, mais l'auditeur clé does't semblent écouter mon panneau de RoofRunnerGame **

J'ai trouvé deux solutions possibles en ligne, mais a voulu demander d'abord .

1) On appelait requestFocus() dans la sous-classe RoofRunnerGame. Le problème avec ceci est qu'une fois que j'ai cliqué sur un panneau différent, il perd le focus. (C'est un correctif à court terme.)

2) Une autre chose mentionnée était d'utiliser keyBindings. Je ne les ai jamais utilisés auparavant. Je le ferai si vous le recommandez, mais préféreriez continuer à utiliser keyListener si c'est possible.

Alors, qu'en pensez-vous? Est-ce que je peux garder le panneau de RoofRunnerGame à KEY à l'écoute?

Répondre

1

Vous pouvez faire en sorte que les autres panneaux ne puissent pas être mis au point, mais cela peut également nécessiter de rendre tous les composants de ces panneaux non concentrables.

Voir this et this des exemples d'ajout d'un écouteur de clé via ActionMap. JComponent.WHEN_IN_FOCUSED_WINDOW Le flag dans la méthode getInputMap() devrait permettre à votre panneau de recevoir des événements d'entrée même s'il n'est pas focalisé.

+0

Qu'en est-il des raccourcis clavier? Quand et pourquoi sont-ils utilisés? Sont-ils supérieurs aux keyListeners dans ce cas ?? –

+0

@Dan James: Les exemples que j'ai donnés concernent les raccourcis clavier. Ils sont meilleurs car ils utilisent mieux les actions (vous pouvez réutiliser la même action pour les boutons, éléments de menu), vous pouvez spécifier quand un composant doit recevoir un événement d'entrée (quand il est focalisé ou quand il est dans une fenêtre focalisée) etc. sont un niveau d'abstraction plus élevé que les auditeurs clés. –