2016-10-14 5 views
0

J'essaie d'utiliser la liaison de touches pour contrôler un jeu (flèches haut, bas, gauche, droite). Mon plan est d'utiliser la liaison de clé avec multi threading, appelant une sorte de méthode de mise à jour.Comment utiliser la liaison de touches avec JFrame dans java

Mon code pour la fenêtre graphique jusqu'à présent:

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.Container; 

public class Main extends JPanel{ 
    public Main(){ 
     JFrame window = new JFrame("New window"); 
     window.setSize(300, 300); 
     window.setVisible(true); 
     Container c = window.getContentPane(); 
     c.add(new Main()); 
    } 
    public static void main(String[] args){ 
     //some code 
     //multi threading code 
    } 
} 

J'ai lu la documentation pour la clé de liaison, mais je ne suis pas sûr de savoir comment l'utiliser pour un JFrame. Je pense que je devrais l'ajouter à c, mais je ne suis pas sûr de savoir comment utiliser la liaison de clés. Merci d'avance pour toute aide.

+0

Clé de liaison de quelle manière? –

+0

@SamOrozco Comme dans l'association d'une clé à une action. La documentation est ici http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html#maps. – SAT

Répondre

0

Vous devez utiliser KeyBindings avec un composant qui s'étend de JComponent, tel qu'un JPanel car l'objet doit avoir les getActionMap() et getInputMap() pour autoriser les liaisons. JFrame ne s'étend pas à partir de JComponent et vous ne pouvez donc pas vous lier directement au JFrame, mais vous pouvez lier n'importe lequel de ses composants qui satisfont cette règle. Ainsi, dans votre code ci-dessus, vous pouvez ajouter des liaisons de touches au JPanel principal ou au contentPane de JFrame, qui est un JPanel mais qui devra être lancé en premier.

Votre code ci-dessus a cependant un problème en ce que le c.add(new Main()); dans le constructeur de Main provoquera une récursion infinie et donc une exception StackOverflowException. Ajoutez this ou placez le code de création JFrame dans la méthode principale.

+0

Merci d'avoir vu cette erreur. Ce code est juste un exemple que j'ai écrit assez rapidement. Êtes-vous en train de dire que je peux ajouter les raccourcis clavier à la fenêtre, ou est-ce que je ne comprends pas bien votre explication? – SAT

+0

@SAT: Encore une fois, aussi simple que possible: vous pouvez uniquement ajouter des liaisons de touches à un objet qui hérite de JComponent. Arrêt complet. Si vous vous demandez si vous pouvez l'ajouter à une classe, vérifiez son API et voyez si elle hérite de JComponent. JFrames ne le fait pas, JPanels le fait. –

+0

Je vois maintenant. Je vous remercie. Je peux créer un objet JPanel en utilisant window.getContentPane(). – SAT