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

AWT/Swing Java Discussion :

Event et mise à jour de fenêtre


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut Event et mise à jour de fenêtre
    Bonjour,

    Je commence tout juste le swing mais j'ai un drôle de problème que je n'arrive pas résoudre depuis bientot 4 jours.
    J'ai crée un projet simpliste où le problème est toujours présent.
    J'ai une fonction déplacement qui crée un pion et le déplace.

    Il se trouve que quand j'envoie la fonction de déplacement à partir du main, tout se passe bien: le pion se crée, il bouge, il s'arrete.

    Si je lance la fonction quand je relâche la souris (soit mouseReleased) la fenêtre attend la fin de la fonction mouseRelesed pour se mettre à jour(le pion apparais directement à sa position d'arrivée).
    J'en suis sûr car j'ai rajouté un Scanner pour bloquer la fonction mouseRealeased et je vois bien que tant que je n'est rien rentré en ligne de commande, tout reste figé dans ma fenêtre.
    Voici le 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
     
    package Pandemie;
    import java.awt.Label;
    import java.awt.Point;
    import java.util.Hashtable;
    import java.util.LinkedList;
    import java.util.List;
     
    import javax.swing.JFrame;
    import javax.swing.JLabel;
     
    import Joueur.Joueur;
    import Ville.Ville;
     
    public class Pandemie {
    	public static Hashtable<String, Ville> Monde;
    	public static List<Joueur> Joueurs;
    	public static Fenetre fen;
    	public static JLabel [] Labels={null,null,null,null}; 
            public static void main(String[] args){
            	fen = new Fenetre();
                //fen.Deplacement_pion(new Point (50,50));// marche
     
               // deplacement(new Point (50,50)); //marche
            }
    		private static void deplacement(Point point) {
    			//fen.Deplacement_pion(new Point (50,50));
     
    		}
     
    }
    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
    package Pandemie;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.File;
    import java.io.IOException;
    import java.util.Scanner;
     
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import java.awt.Point;
     
     
     
    public class Map extends JPanel {
    	Image img ;
    	static Point clic;
    		public Map(){ 
    			try {
    				img = ImageIO.read(new File("Plateau.jpg"));
    	            addMouseListener(new Moustener());
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
            public void paintComponent(Graphics g){
            	super.paintComponents(g);
                g.drawImage(img, 2, 2,1436,902,this);
            }               
            public class Moustener extends MouseAdapter
            {
                public void mouseReleased(MouseEvent evt)
               {
                  int xClic = evt.getX();
                  int yClic = evt.getY();
     
    	          clic=new Point(xClic,yClic);
    	          Deplacement_pion(new Point(50,50));
    	          Scanner sc = new Scanner(System.in);
    	          String choix = sc.nextLine();
    	          System.out.println(choix);
               }
            }
        	public void Deplacement_pion(Point Clic){
     
        	 	JLabel label = new JLabel();
        	 	ImageIcon image = new ImageIcon(Toolkit.getDefaultToolkit().getImage("pion1.png"));
        	 	label.setPreferredSize(new Dimension(image.getIconWidth(), image.getIconHeight()));
        	 	label.setIcon(image);
     
         		label.setPreferredSize(new Dimension(image.getIconWidth(), image.getIconHeight()));
         		label.setIcon(image);
     
         		add(label);
                label.setBounds(100,100,80,30);
         		int i;
        	 	for( i = 0; i < 100; i++)
        	    {
     
        	 		label.setLocation(50+i,50+i);
        	 		this.revalidate();
        	 		this.repaint();
        	 		label.revalidate();
        	 		label.repaint();
        	 		try {
        	            Thread.sleep(20);
        		    } catch (InterruptedException e) {
        		        e.printStackTrace();
     
        	        }
     
        		}
     
     
        	}
    }
    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
     
    package Pandemie;
     
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Point;
    import java.awt.Toolkit;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
     
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
     
    import Joueur.Joueur;
    import Ville.Ville;
     
    public class Fenetre extends JFrame{
     
         public Fenetre(){
             this.setTitle("Test");
             this.setLocationRelativeTo(null);
             this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             this.setExtendedState(this.MAXIMIZED_BOTH);
             this.setUndecorated(true);
             this.setContentPane(new Map());
             this.setLayout(null);
             this.setVisible(true);
     
     
         }
     
     
     
    }
    Cela fait trop longtemps que je reste bloqué sur cette bétise...
    Merci de votre aide!


    edit: même pb pour eclipse et Netbeans

  2. #2
    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 : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu devrais lire la documentation relative à l'EDT (Event Dispatch Thread) présente sur le site.
    Pour faire court : un seul et unique thread, l'EDT, gère les évènements souris et l'affichage (et encore quelques autres trucs). La méthode mouseReleased est exécutée par l'EDT. Cette méthode appelle ta méthode Deplacement_pion.
    Ta méthode de déplacement fait des appels à repaint qui sont des ordres de rafraichissements envoyés à l'EDT.
    Or tes ordres de rafraichissement seront joués lorsque l'EDT sera libre, c'est à dire à la fin de ton animation
    Pour résoudre le problème, ta méthode de déplacement doit être appelée dans un thread séparé.

    Dernière chose : tu devrais charger tes images une fois pour toute, à la construction de ta classe.
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Tu devrais lire la documentation relative à l'EDT (Event Dispatch Thread) présente sur le site.
    Pour faire court : un seul et unique thread, l'EDT, gère les évènements souris et l'affichage (et encore quelques autres trucs). La méthode mouseReleased est exécutée par l'EDT. Cette méthode appelle ta méthode Deplacement_pion.
    Ta méthode de déplacement fait des appels à repaint qui sont des ordres de rafraichissements envoyés à l'EDT.
    Or tes ordres de rafraichissement seront joués lorsque l'EDT sera libre, c'est à dire à la fin de ton animation
    Pour résoudre le problème, ta méthode de déplacement doit être appelée dans un thread séparé.

    Dernière chose : tu devrais charger tes images une fois pour toute, à la construction de ta classe.
    Merci pour ton aide archi rapide et aussi très bien expliquée, ca faisait un bout de temps que je bloquais sur cette bêtise...
    Je vais bosser les thread (que je ne connais pas encore mais j'ai en ce moment même un cours dessus!)
    Mes images ne sont chargées qu'une fois, mais j'ai fais mon projet test au plus simple.
    Encore merci

  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 : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Neotaxi Voir le message
    Mes images ne sont chargées qu'une fois, mais j'ai fais mon projet test au plus simple.
    Encore merci
    Je parlais de ton image "pion1.png" dans la méthode Deplacement_pion
    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.

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

Discussions similaires

  1. Mise à jour d'une fenêtre parent
    Par flavia dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/10/2007, 13h26
  2. Réponses: 4
    Dernier message: 20/02/2007, 16h34
  3. Mise à jour de l'affichage de la fenêtre
    Par YuGiOhJCJ dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 21/12/2006, 11h55
  4. Mise à jour programmée de contenu de fenêtres filles
    Par plegat dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 13/11/2006, 01h30
  5. JMenuBar, et mise à jour fenêtre
    Par piro dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 03/03/2006, 11h08

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