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

avec Java Discussion :

KeyListener dans deux classe ?


Sujet :

avec Java

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 162
    Points : 73
    Points
    73
    Par défaut KeyListener dans deux classe ?
    Bonjour,

    est il possible de mettre un addKeyListener dans une classe n˚1 et de mettre le KeyPressed dans une autre classe n˚2 via une fonction de cette classe n˚2 ?

    Merci.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si tu parles d'enregistrer un KeyListener sur une instance d'une classe, dont la méthode keyPressed() appelle une méthode d'une autre instance d'une autre classe, oui, il n'y a aucun problème, si les accès et portées le rendent possible, comme dans n'importe quel cas d'appel de méthode sur une instance dans une méthode d'une autre instance.

    Exemple, pour classe 1 qui est Exemple, et classe 2 qui est JFrame :
    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
    public class Exemple extends JPanel {
     
    	public Exemple(final JFrame frame) {
    		setFocusable(true);
    		addKeyListener(new KeyAdapter() {
    			@Override
    			public void keyPressed(KeyEvent e) {
    				if ( e.getKeyCode()==KeyEvent.VK_ENTER ) {
    					System.out.println("keypressed enter");
    					frame.dispose();
    				}
    			}
    		});
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Exemple");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new Exemple(frame);
     
    		frame.add(panel);
     
    		frame.setSize(200, 200);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 162
    Points : 73
    Points
    73
    Par défaut
    Merci pour cette réponse.

    Malheureusement, je me suis mal exprimé. En effet, je voulais parler du cas où… je vais plutôt afficher mon code ça sera plus simple.

    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
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
    public class Main{
     
     
        public static void main(String[] args){
            Personnage t = new Personnage(10,10);
            JPanel p = new JPanel();
            Fenetre f = new Fenetre(p);
            JLabel j = new JLabel();
            t.afficher(j, p);
            f.setVisible(true);
     
            while(true){
     
                //ici je devrai mettre ma fonction déplacer et pourquoi pas un repaint()
            }
     
     
        }   
    }
    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
    import java.awt.Color;
    import java.awt.event.KeyListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
     
    import javax.swing.*;
     
    @SuppressWarnings("serial")
    public class Fenetre extends JFrame implements KeyListener{
     
        Fenetre(JPanel p){
            WindowListener l = new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    System.exit(0);
                }
            };
            addWindowListener(l);
     
            setSize(300,400);
            p.setBackground(Color.WHITE);
            getContentPane().add(p);   
            addKeyListener(this);
     
     
     
        }
    }
    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
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyAdapter;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    @SuppressWarnings("serial")
    public class Personnage extends JFrame{
     
        int x,y;
     
        Personnage(int x, int y){
            this.x=x;
            this.y=y;
            image = new ImageIcon("image.png");
        }
     
        public void afficher(JLabel j, JPanel p){
     
            j = new JLabel(image);
            p.add(j);
        }
        public void deplacer(){
            addKeyListener(new KeyAdapter(){
                public void keyPressed(KeyEvent e) {
                    System.out.print("A");
                }
            });
     
        }
     
        private ImageIcon image;
     
     
    }
    Ce code ne fonctionne pas, en prime du fait que je doive absolument implémenter les méthodes KeyListener ; ce qui me paraît évident, mais ça me gêne un peu (en fait beaucoup)…

    En espérant que j’ai apporté assez de précision pour que mon problème soit clair.

    Merci.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est normal de devoir implémenter les méthodes d'une interface dans une classe qui l'implémente : c'est le principe. Par contre, il n'est pas nécessaire que la JFrame implémente KeyListener, il est juste nécessaire qu'on enregistre sur composant qui puisse avoir le focus une classe qui implémente KeyListener pour capter les évenements clavier.

    Ensuite, on ne fait pas une boucle qui enregistre des listeners : à chaque itération, un nouveau listener va être enregistré. Un seul est nécessaire et suffisant. Le principe, comme pour tout écouteur d'évenement est d'enregistrer un écouteur sur l'instance qui produit les évenements et de mettre dans les méthodes de l'écouteur le code qui doit y réagir.

    Pourquoi Personnage est-il une JFrame ? Autant en faire un JLabel, et ne pas utiliser cette structure avec la méthode afficher : au lieu d'appeler personnage.afficher(label, frame), faire simple frame.add(personnage). Attention, pour pouvoir afficher des composants en coordonnées absolues dans un conteneur, il faudra que ce conteneur ait aucun layout manager, ou un layout manage prévu pour faire de l'affichage absolu. Pas besoin de x et y, un JLabel a déjà des coordonnées.

    Il existe une alternative au KeyListener qui te permettra d'écouter globalement les évenements du clavier : le KeyEventDistpatcher.

    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
    public class Personnage extends JLabel {
     
    	private final static ImageIcon ICON = new ImageIcon(Personnage.class.getResource("image.png"));
    	public Personnage() {
    		super(ICON);
    		setSize(new Dimension(ICON.getIconWidth(), ICON.getIconHeight()));
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // pas besoin de WindowwListener qui fait System.exit(0)
     
    		Personnage personnage = new Personnage(); // je créé un personnage
     
    		JPanel panel =new JPanel();
    		panel.setLayout(null); // positionnement absolu
    		panel.add(personnage); // j'ajoute le personnage à mon container sans layout manager
     
    		frame.getContentPane().add(panel);
     
    		KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
     
    			@Override
    			public boolean dispatchKeyEvent(KeyEvent e) {
    				switch( e.getID() ) {
    					case KeyEvent.KEY_PRESSED:
    					   switch( e.getKeyCode() ) {
    				   	     case KeyEvent.VK_UP:
    				   	    	 move(0,-1);
    							 return false; // pour que la touche ne soit pas traitée par un autre écouteur
    				   	     case KeyEvent.VK_DOWN:
    				   	    	 move(0,1);
    							 return false; // pour que la touche ne soit pas traitée par un autre écouteur
    				   	     case KeyEvent.VK_LEFT:
    				   	    	 move(-1,0);
    							 return false; // pour que la touche ne soit pas traitée par un autre écouteur
    				   	     case KeyEvent.VK_RIGHT:
    				   	    	 move(1,0);
    							 return false; // pour que la touche ne soit pas traitée par un autre écouteur
    					   }
    				}
    				return true;
    			}
     
    			private void move(int dx, int dy) {
    				Point location = personnage.getLocation();
    				location.x+=dx*8;
    				location.y+=dy*8;
    				personnage.setLocation(location);
    				personnage.getParent().repaint();
    			}
     
    		});
     
    		// j'afffiche ma fenêtre
    		frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    		personnage.setLocation((frame.getWidth()-personnage.getWidth())/2,(frame.getHeight()-personnage.getHeight())/2); // ^position au milieu au départ
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }
    Ou avec mouvement continu :
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    public class Personnage extends JLabel {
     
    	private final static ImageIcon ICON = new ImageIcon(Personnage.class.getResource("image.png"));
    	public Personnage() {
    		super(ICON);
    		setSize(new Dimension(ICON.getIconWidth(), ICON.getIconHeight()));
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // pas besoin de WindowwListener qui fait System.exit(0)
     
    		Personnage personnage = new Personnage(); // je créé un personnage
     
    		JPanel panel =new JPanel(true);
    		panel.setLayout(null); // positionnement absolu
    		panel.add(personnage); // j'ajoute le personnage à mon container sans layout manager
     
    		frame.getContentPane().add(panel);
     
    		class MovementTask implements ActionListener {
     
    			int dx;
    			int dy;
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				if ( dx!=0 || dy!=0 ) {
    					Point location = personnage.getLocation();
    					location.x+=dx*8;
    					boolean stopmove=false;
    					if ( location.x<0 ) {
    						stopmove=true;
    						location.x=0;
    					}
    					else if ( location.x>=panel.getWidth()-personnage.getWidth()) {
    						stopmove=true;
    						location.x=panel.getWidth()-personnage.getWidth();
    					}
    					location.y+=dy*8;
    					if ( location.y<0 ) {
    						stopmove=true;
    						location.y=0;
    					}
    					else if ( location.y>=panel.getHeight()-personnage.getHeight()) {
    						stopmove=true;
    						location.y=panel.getHeight()-personnage.getHeight();
    					}
    					personnage.setLocation(location);
    					panel.repaint();
    					if ( stopmove ) {
    						dx=0;
    						dy=0;
    					}
    				}
    			}
     
    			public void setMoveX(int dx) {
    				this.dx=dx;
    			}
     
    			public void setMoveY(int dy) {
    				this.dy=dy;
    			}
     
    		}
     
    		MovementTask task =  new MovementTask();
     
    		Timer timer = new Timer(33, task);
     
     
    		KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
     
    			@Override
    			public boolean dispatchKeyEvent(KeyEvent e) {
    				switch( e.getID() ) {
    					case KeyEvent.KEY_PRESSED:
    					   switch( e.getKeyCode() ) {
    				   	     case KeyEvent.VK_UP:
    				   	    	 task.setMoveY(-1);
    							 return false; // pour que la touche ne soit pas traitée par un autre écouteur
    				   	     case KeyEvent.VK_DOWN:
    				   	    	 task.setMoveY(1);
    							 return false; // pour que la touche ne soit pas traitée par un autre écouteur
    				   	     case KeyEvent.VK_LEFT:
    				   	    	 task.setMoveX(-1);
    							 return false; // pour que la touche ne soit pas traitée par un autre écouteur
    				   	     case KeyEvent.VK_RIGHT:
    				   	    	 task.setMoveX(1);
    							 return false; // pour que la touche ne soit pas traitée par un autre écouteur
    					   }
    				}
    				return true;
    			}
     
    		});
     
    		// j'afffiche ma fenêtre
    		frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    		personnage.setLocation((frame.getWidth()-personnage.getWidth())/2,(frame.getHeight()-personnage.getHeight())/2); // ^position au milieu au départ
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    		timer.start();
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 162
    Points : 73
    Points
    73
    Par défaut
    Merci,

    pour ces très bons conseils et explications , je vais essayer de les appliquer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/06/2011, 16h04
  2. Pointeurs contenus dans deux classes
    Par arkham55 dans le forum Débuter
    Réponses: 2
    Dernier message: 24/03/2011, 15h14
  3. Probleme d'une meme declaration dans deux classes
    Par zouari.rami dans le forum Débuter
    Réponses: 1
    Dernier message: 04/12/2010, 11h25
  4. utilisation d'un NotifyIcon dans deux class
    Par Woodone dans le forum ASP.NET
    Réponses: 1
    Dernier message: 13/01/2010, 09h03
  5. Utilisation d'un tableau dans deux classes
    Par Yokooo dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 30/07/2009, 16h41

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