IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

méthode addKeyListener() indéfinie


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 53
    Points : 36
    Points
    36
    Par défaut méthode addKeyListener() indéfinie
    Bonjour,

    j'ai un problème avec le KeyListener : impossible d'utiliser la méthode addKeyListener...
    La fonction est non définie. (pourtant le import me semble correct).

    (Je veux la placer dans la méthode Loop() (avant le while qui fait la boucle).
    (D'ailleurs, il n'y a pas une autre manière de faire pour la boucle ?!!)

    Voici une partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    package gameplay;
     
    import java.awt.DisplayMode;
    import java.awt.Graphics2D;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
     
    import utils.ScreenManager;
     
    public class Game implements KeyListener {
    	private static final DisplayMode POSSIBLE_MODES[] = {
    		new DisplayMode(1680, 1050, 32, 0), new DisplayMode(1680, 1050, 24, 0),
    		new DisplayMode(800, 600, 32, 0), new DisplayMode(800, 600, 24, 0),
    	    new DisplayMode(800, 600, 16, 0), new DisplayMode(640, 480, 32, 0),
    	    new DisplayMode(640, 480, 24, 0), new DisplayMode(640, 480, 16, 0) 
    	};
    	private ScreenManager _Screen;
     
    	public static void main(String args[]) {
    		Game game = new Game();
    	    game.run();
    	}
     
    	public void run() {		
    		_Screen = new ScreenManager();
    	    try {
    	    	DisplayMode displayMode = _Screen.findFirstCompatibleMode(POSSIBLE_MODES);
    	    	_Screen.setFullScreen(displayMode);
    	    	Loop();
    	    } finally {
    	    	_Screen.restoreScreen();
    	    }
    	}
     
    	public void Loop() {
    		long startTime = System.currentTimeMillis();
    	    long currTime = startTime;
     
    	    while(true) {
    	    	long elapsedTime = System.currentTimeMillis() - currTime;
    	    	currTime += elapsedTime;
     
    	    	// update game
    	    	Update(elapsedTime);
     
    	    	ObjectManager.getInstance().Update(elapsedTime);
     
    	    	// draw and update the screen
    	    	Graphics2D g = _Screen.getGraphics();
    	    	ObjectManager.getInstance().Draw(g);
    	    	g.dispose();
    	    	_Screen.Update();	
     
    	    	// take a nap
    	    	try {
    	    		Thread.sleep(20);
    	    	} catch (InterruptedException ex) {
    	    	}
    	    }
    	}
     
    	public void Update(long elapsedTime) {	
    	}
     
    	@Override
    	public void keyPressed(KeyEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void keyReleased(KeyEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void keyTyped(KeyEvent e) {
    		// TODO Auto-generated method stub
     
    	}
    }
    Merci d'avance et bon courage pour vos travaux respectifs
    ++

  2. #2
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Bonjour, il faut un composant pour ajouter ce KeyListener, une JFrame par exemple.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    A ok !
    Merci ^^.

    Mais ça ne fonctionne toujours pas ^^'.
    Et j'avoue que je ne comprends pas trop pourquoi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    package gameplay;
     
    import java.awt.DisplayMode;
    import java.awt.Graphics2D;
     
    import utils.ScreenManager;
     
    public class Game {
    	private BoucleMgr _BoucleMgr;
    	private static final DisplayMode POSSIBLE_MODES[] = {
    		new DisplayMode(1680, 1050, 32, 0), new DisplayMode(1680, 1050, 24, 0),
    		new DisplayMode(800, 600, 32, 0), new DisplayMode(800, 600, 24, 0),
    	    new DisplayMode(800, 600, 16, 0), new DisplayMode(640, 480, 32, 0),
    	    new DisplayMode(640, 480, 24, 0), new DisplayMode(640, 480, 16, 0) 
    	};
    	private ScreenManager _Screen;
     
    	public static void main(String args[]) {
    		Game game = new Game();
    	    game.run();
    	}
     
    	public void run() {		
    		_BoucleMgr = new BoucleMgr();
    		_Screen = new ScreenManager();
    	    try {
    	    	DisplayMode displayMode = _Screen.findFirstCompatibleMode(POSSIBLE_MODES);
    	    	_Screen.setFullScreen(displayMode);
    	    	Controller PlayerController = new Controller(_BoucleMgr,_Screen);
    	    	_Screen.getJFrame().addKeyListener(PlayerController);
    	    	Loop();
    	    } finally {
    	    	_Screen.restoreScreen();
    	    }
    	}
     
    	public void Loop() {
    		long startTime = System.currentTimeMillis();
    	    long currTime = startTime;
     
    	    do {
    		    _Screen.getJFrame().requestFocusInWindow();
    	    	long elapsedTime = System.currentTimeMillis() - currTime;
    	    	currTime += elapsedTime;
     
    	    	// update game    	
    	    	ObjectManager.getInstance().Update(elapsedTime);
     
    	    	// draw and update the screen
    	    	Graphics2D g = _Screen.getGraphics();
    	    	ObjectManager.getInstance().Draw(g);
    	    	g.dispose();
    	    	_Screen.Update();	
     
    	    	// take a nap
    	    	try {
    	    		Thread.sleep(20);
    	    	} catch (InterruptedException ex) {
    	    	}
    	    } while(_BoucleMgr.Boucler());
    	}
     
    	public class BoucleMgr {
    		private boolean _bContinuer = true;
     
    		public BoucleMgr() {	
    		}
     
    		public void Terminer() {
    			_bContinuer = false;
    		}
     
    		public boolean Boucler() {
    			return _bContinuer;
    		}
    	}
    }
    et le controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    package gameplay;
     
    import gameplay.Game.BoucleMgr;
     
    import java.awt.Color;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
     
    import utils.ScreenManager;
     
    public class Controller implements KeyListener {
    	protected BoucleMgr _BoucleMgr;
    	protected ScreenManager _Screen;
     
    	public Controller(BoucleMgr boucleMgr, ScreenManager screen) {
    		_BoucleMgr = boucleMgr;
    		_Screen = screen;
    	}
     
    	@Override
    	public void keyPressed(KeyEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void keyReleased(KeyEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void keyTyped(KeyEvent e) {
    		if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {
    			//_BoucleMgr.Terminer();
    			_Screen.getJFrame().setBackground(Color.GREEN);
    		}
    	}
    }
    Désolé de vous accabler avec une tonne de code ^^'. Mais j'ai peur qui si je ne met pas au moins ça, je vous enlève les moyens de comprendre d'où vient l'erreur.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il faut définir le "ça ne fonctionne pas". Si tu postes ici, c'est que ça ne fonctionne pas. Erreur de compilation ? D'exécution ?
    Donne les erreurs
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    Enfait il n'y a aucune erreur.
    Il ne se passe simplement... rien. (lorsque j'appuie sur Echap).

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    La ou c'est bizarre, c'est que la méthode KeyPressed marche, mais pas la KeyTyped.

    Comment je peux faire si je veux faire "2 touches entrainent une action" ?
    On ne peut utiliser qu'une touche à la fois...

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Generalement pour qu'un composant recupere un event clavier il faut qu'il ait le focus. De plus certains ont du mal a capturer ce genre d'evenements.
    Pour pallier a ce genre de problemes, il est plus recommande de passer par l'ActionMap et l'InputMap. Un truc du genre (a tester) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    setFocusable(true);
    requesFocus();
    [...]
    InputMap inputMap = getInputMap();
    inputMap.put(KeyStroke.getKeyStroke("escape", "greenBackground"));
    ActionMap actionMap = getActionMap();
    actionMap.put("greenBackground", new BackgroundToGreenAction());
     
    class BackgroundToGreenAction extends AbstractAction {
      /**
       * {@inheritDoc}
       */
      @Override
      public void actionPerformed(ActionEvent event) {
        _Screen.getJFrame().setBackground(Color.GREEN);
      }
    }
    Quand la touche Esc est capturee, l'InputMap renvoie la cle "greenBackground" qui permet de recuperer l'Action BackgroundToGreenAction dans l'ActionMap et d'executer cette derniere.

    Et les KeyStroke permettent de definir des combinaisons de touches.

    Avec ce principe de cle et de maps il est beaucoup plus aise de permettre a l'utilisateur de reconfigurer les touches d'un jeu par exemple.

    Sinon, pour le reste vu que tu as des propres objets sans qu'on sache ce que c'est reelement en dessous, je suis un peu suspicieux de cette boucle loop() et de la maniere dont tu dessines a l'ecran (un gros Thread.sleep() en plein milieu et un getGraphics() );
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Permuter 2 méthodes indéfiniment
    Par BobbyWeb dans le forum Général Java
    Réponses: 9
    Dernier message: 30/08/2011, 15h44
  2. OnSubjobOk, Méthode tOracleInput est indéfinie
    Par cocaaladioxine dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 07/06/2011, 16h26
  3. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo