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

Interfaces Graphiques en Java Discussion :

probléme avec les touches du clavier


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre régulier Avatar de ia.jenny
    Profil pro
    Inscrit en
    Août 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 152
    Points : 78
    Points
    78
    Par défaut probléme avec les touches du clavier
    Bonjour,
    je ne comprend pas pourquoi, il n'y a pas de réaction sur "dx" quand j’appuie sur la touche gauche
    j'ai longtemps chercher sur internet et pas de solution.
    je ne veux pas de timer qui réinitialise tout les ms.
    dois je faire une autre class. comment faire pour que cela fonctionne.
    merci encore.


    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
    package imageTest;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
     
    import java.awt.event.KeyListener; // <------------------------
    import java.awt.event.KeyEvent; // <------------------------
    import java.awt.event.*; // <------------------------
     
     
    	public class Main extends JPanel
    	{
    		 private int dx; // <------------------------
     
    	    BufferedImage[] bufferedImage  = new BufferedImage[100];
    	    public static void main(String[] args)
    	    {  
    	        JFrame frame=new JFrame();
    	        frame.setTitle("Ma premier fenetre");
    	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	        frame.setSize(800,600);
     
    	        frame.getContentPane().add(new Main());
    	        frame.setVisible(true);
    	     } 
     
     
    // <------------------------ 
    	    public void keyReleased(KeyEvent e) 
    	    {
    	    	int key = e.getKeyCode();
     
                       if (key == KeyEvent.VK_LEFT)
                      {  
                	      dx--;
                	       repaint();
                       }  
    	    }
    // <------------------------
     
     
    		 public void paintComponent(Graphics g)
    		 { 
    			 super.paintComponent(g); // <------------------------
    			 for(int i=1; i<2; i++) // 1 image pour le moment
    			 {
    				try
    				{
    					this.bufferedImage[i] =ImageIO.read(new File(i + ".jpg"));
    				}
    				catch(IOException e)
    				{
    					e.printStackTrace();
    				}
    			 }
     
     
    			 	for(int i=0; i<6; i++)
    			 	{
    				 	for(int j=0; j<4; j++)
    				 	{
    				 		g.drawImage( this.bufferedImage[1] ,i*100+dx*100,j*100,100,100,this);
    				 	}
    			 	} 
     
    		 }  
     
     
    	}

  2. #2
    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
    Tu as vérifié que ça fonctionnait avec les autres touches ? Ton composant est focusable et a le focus ?
    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

  3. #3
    Membre régulier Avatar de ia.jenny
    Profil pro
    Inscrit en
    Août 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 152
    Points : 78
    Points
    78
    Par défaut
    Bonjour,
    électivement, c'est un problème de focus. peut être un problème avec "public void keyReleased(KeyEvent e)"
    la touche est peut être reconnu sauf que l'image n'est pas actualiser

    j'ai modifier le programme, mais ça ne fonctionne toujours pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	        Main ep = new Main();
    	        JFrame frame=new JFrame();
    	        frame.setTitle("Ma premier fenetre");
    	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	        frame.setContentPane(ep);
    	        frame.setVisible(true);
    	        frame.setSize(800,600);
    	        ep.requestFocus(true);

  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
    Salut,

    La méthode keyReleased ne sera pas appelée si tu n'enregistres pas d'écouteur sur le composant.

    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
    public class Main extends JPanel {
     
       private int dx; // <------------------------
     
       BufferedImage[] bufferedImage  = new BufferedImage[100];
     
     
        public Main() {
              addKeyListener(new KeyAdapter() { // enregistrement de l'écouteur
                      public void keyReleased(KeyEvent e) {
    	    	      int key = e.getKeyCode();
     
                       if (key == KeyEvent.VK_LEFT) {  
                	      dx--;
                	       repaint();
                       }  
     
    	        }
     
              });
        }
     
        public void paintComponent(Graphics g)
    		 { 
    			 super.paintComponent(g); // <------------------------
    			 for(int i=1; i<2; i++) // 1 image pour le moment
    			 {
    				try
    				{
    					this.bufferedImage[i] =ImageIO.read(new File(i + ".jpg"));
    				}
    				catch(IOException e)
    				{
    					e.printStackTrace();
    				}
    			 }
     
     
    			 	for(int i=0; i<6; i++)
    			 	{
    				 	for(int j=0; j<4; j++)
    				 	{
    				 		g.drawImage( this.bufferedImage[1] ,i*100+dx*100,j*100,100,100,this);
    				 	}
    			 	} 
     
    		 }  
     
     
     
    }
    Par ailleurs, peut-être que ce serait plus simple de gérer ça avec un KeyboardFocusManager, ce qui te permettra de gérer plus globalement les problématiques de touches et de focus.

    Par ailleurs, évite de charger des fichiers en mémoire dans l'Event Dispatch Thread (donc dans les méthodes de dessin de Swing). Il faut charger au minimum ce thread si on veut une animation fluide, et les I/O même sur du SSD et même s'il y a du cache, tout ça, c'est lent relativement. Et bonjour l'impact sur le GC. Surtout quand tu vas en charger 100 à chaque repaint ! Et ça ne sert à rien de charger sans arrêt les mêmes fichiers.
    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 Avatar de ia.jenny
    Profil pro
    Inscrit en
    Août 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 152
    Points : 78
    Points
    78
    Par défaut
    merci pour ton aide
    Par ailleurs, évite de charger des fichiers en mémoire dans l'Event Dispatch Thread (donc dans les méthodes de dessin de Swing). Il faut charger au minimum ce thread si on veut une animation fluide...
    Je sais tout ça, je ne sais pas le faire pour le moment.
    il y a beaucoup de chose à revoir dans mon code.

    au sujet des touches, dx incrémente bien merci, mais l'image devrais bouger. Comment Faire et sans timer ?
    (plus tard, ça sera seulement les textures bufferedImage[1] qui changeront et non tout les images i*100+dx*100,j*100)

    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
    package imageTest;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.awt.event.*; 
     
    	public class Main extends JPanel
    	{
    	    static int dx;
    	    BufferedImage[] bufferedImage  = new BufferedImage[100];
     
    	     public static void main(String[] args)
    	    {  
     
    	    	 JFrame frame=new JFrame();
    	        frame.setTitle("Ma premier fenetre");
    	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	        frame.setSize(800,600);
    	        frame.getContentPane().add(new Main());
    	        frame.setVisible(true);
    	        frame.setFocusable( true );
     
    	        frame.addKeyListener(new KeyAdapter() {
    	            public void keyPressed(KeyEvent e) {
    	               if (e.getKeyCode() == KeyEvent.VK_UP) {
    	            	   dx--;
    	            	   System.out.println(dx);
    	               }
    	            }
    	         });   
     
    	     } 
     
     
     
     
    		 public void paintComponent(Graphics g)
    		 { 
    			 super.paintComponent(g);
    			 for(int i=1; i<2; i++) // 1 image pour le moment
    			 {
    				try
    				{
    					this.bufferedImage[i] =ImageIO.read(new File(i + ".jpg"));
    				}
    				catch(IOException e)
    				{
    					e.printStackTrace();
    				}
    			 }
     
     
    			 	for(int i=0; i<6; i++)
    			 	{
    				 	for(int j=0; j<4; j++)
    				 	{
    				 		g.drawImage( this.bufferedImage[1] ,i*100+dx*100,j*100,100,100,this);
    				 	}
    			 	} 
     
    		 }  
     
     
    	}

  6. #6
    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
    Citation Envoyé par ia.jenny Voir le message

    au sujet des touches, dx incrémente bien merci, mais l'image devrais bouger. Comment Faire et sans timer ?
    (plus tard, ça sera seulement les textures bufferedImage[1] qui changeront et non tout [B]les images i
    l'image ne bouge juste parce qu'il n'y a pas de repaint() après le dx--;. De manière général, toute modification d'état servant dans l'affichage peut soit nécessiter un repaint, soit nécessiter un relayout et un repaint. Swing gère tout seul tout ce qui est modification dans ses composants, ou presque (disons qu'il y'en a certaines où pour éviter de faire trop souvent des repaints ou des relayouts, il ne le fait pas tout seul et il faut le faire en appelant les méthode repaint(), et/ou revalidate().
    Et c'est encore plus vrai lorsque ce sont juste des variables à toi que tu modifies et que Swing ne peut pas connaître. Il faut donc appeler explicitement repaint pour forcer Swing à remettre à jour l'affichage en fonction des nouvelles valeurs de tes variables, si tu ne veux pas évidemment attendre une action automatique de Swing qui le ferait (par exemple celle qui pourrait se faire en changeant la taille de la fenêtre à la souris).
    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.

  7. #7
    Membre régulier Avatar de ia.jenny
    Profil pro
    Inscrit en
    Août 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 152
    Points : 78
    Points
    78
    Par défaut
    beaucoup, ça fonctionne

    +1

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

Discussions similaires

  1. Se déplacer avec les touches du clavier
    Par Scr4m03 dans le forum VB.NET
    Réponses: 1
    Dernier message: 21/01/2010, 18h07
  2. [AC-2003] Problème avec les touche de fonctions ?
    Par electrosat03 dans le forum VBA Access
    Réponses: 3
    Dernier message: 30/06/2009, 06h44
  3. Simuler la souris avec les touches du clavier
    Par Jérôme5 dans le forum Visual C++
    Réponses: 2
    Dernier message: 20/04/2009, 11h32
  4. Problème avec la touche ^ du clavier
    Par migesem dans le forum MATLAB
    Réponses: 3
    Dernier message: 22/09/2007, 18h33
  5. Valider avec les touches du clavier
    Par pierrot67 dans le forum Bases de données
    Réponses: 8
    Dernier message: 17/02/2006, 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