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 :

Image animée et bouton dans une JFrame


Sujet :

Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Image animée et bouton dans une JFrame
    Bonjour/Bonsoir tout le monde,

    Alors voilà, j'ai mis un JTextField et un bouton dans une JFrame, le bouton sert à récupérer la valeur entrée dans ce JTextField et bouge une image (toujours dans la JFrame) en fonction de la valeur entrée.
    Mon image est censée bouger de pixel en pixel grâce à un "for".
    Le problème est que, après avoir entrer une valeur et cliquer sur le bouton, le programme charge quelques secondes et mon image se téléporte à l'endroit où elle est censé s'arrêter (J'ai pourtant mis un sleep(5)).
    Cela me fais la même chose si je mets un println dans le for, toutes les lignes s'affichent en même temps.

    J'ai essayé de mettre un cadre "Dessin", mais ça fait la même chose et les composants bugs.
    J'ai tester sans les JTextField et bouton et ça marche sans problème.

    J'ai aussi testé en créant 2 JFrames avec l'image dans l'une, et les composants dans l'autre, toujours le même souci.

    Faut-il que je sépare ma JFrame en deux avec une zone "Dessin" et une autre où mettre mes composants ? (Je ne sais même pas si c'est possible)

    Merci d'avance !

  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 : 55
    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,

    Il est utile de nous donner le code quand tu poses des questions sur son dysfonctionnement, afin qu'on puisse te donner une réponse adaptée. Bon, là, je devine quand même que tu dois faire ta boucle dans actionPerformed() de l'ActionListener du bouton (ou une méthode appelée directement, ou indirectement, par actionPerformed()). Tu ne peux pas procéder comme ça : le traitement de l'affichage, tout comme le traitement des évenements comme ceux traité par un ActionListener, sont exécutés par un thread unique, appelé Event Dispatch Thread (EDT). Si tu fais une boucle dans l'actionPerformed, tu bloques le rafraichissement de l'affichage tant que la boucle se déroule (tant que tout le code fait dans actionPerformed n'est pas terminé), et l'affichage se met à jour à la fin. Si tu fais une animation dans cette boucle, tu ne vois donc que le résultat final de ton animation.

    Il faut absolument exécuter ce genre de chose dans un autre thread que l'EDT, et ne faire que la partie rafraichissement dans l'EDT, pour voir ton image bouger. Pour t'aider à réaliser ça plus facilement (bon c'est pas si difficile de faire un thread avec une boucle qui appelle des SwingUtilitiels.invokeLater()), tu peux utiliser un SwingWorker.

    Exemples et tutoriels sur le SwingWorker :


  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Tout d'abord excuse moi du temps que j'ai mis à répondre, j'été trop occupé hier soir.
    Je n'avais pas mis le code parce que je me voyais mal le balancer comme ça, je trouvais que ça faisais un peu "démerdez-vous" mais je comprend bien que c'est plus simple pour vous après.

    Je pense que tu as bien ciblé le problème, j'exécute tout avec l'EDT. J'ai donc été voir les tutos que tu m'as conseillé mais étant donné que je doit coder sous javascool, et non sur éclipse, je ne peut pas les réutiliser pour me les approprier.
    C'est déjà pas facile à comprendre quand on débute mais je ne peux même pas faire de tests et me familiariser avec des SwingWorker déjà écrits parce que je ne connais pas la syntaxe sur javascool..

    Du coup je suis un peu perdu parce que je ne vois pas comment faire..

    En tout cas merci pour ta réponse très complète, au moins maintenant je connais le problème

  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 : 55
    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,

    Je ne connais pas javaschool, mais j'ai répondu à une question concernant un problème similaire ici. La solution donnée n'utilisait pas de SwingWorker, mais un simple Thread. En plus, il y a le lien dans la discussion vers le site avec à priori le programme en javaschool. Ça peut peut-être t'aider.

    [EDIT]Cette discussion aussi pourrait t'intéresser.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Merci bien pour la démarche que tu as faite, j'ai regardé les deux discussions, la première est bel et bien sur java's cool, le problème est que le code n'est pas entier :
    Sur ce logiciel, il y a possibilité d'utiliser des "proglets" avec des bases préconçues pour nous mâcher le travail, donc je ne peux pas voir ce qui m'intéresse.

    La deuxième discussion relate exactement mon problème (d'ailleurs je m'excuse de ne pas l'avoir trouvé, ce n'est pourtant pas faute d'avoir cherché) le soucis ici est que je ne peux pas récupérer les programme pour les mettre sur mon IDE, encore une fois, vu que c'est du java nettement plus pur, il fait des caprices.

    Du coup j'hésite entre apprendre à réaliser des threads à tâtons sur java's cool, j'ai déjà essayé et c'est plutôt galère vu que rien ne compile, ou bien d'abord comprendre sous éclipse, puis essayer sous l'autre IDE, mais là, j'ai un peu peur de perdre mon temps..

    Que me conseillerais-tu ?

  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 : 55
    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
    Ne connaissant pas Javas'cool, ce qu'on peut ou ne peut pas faire, je peux difficilement te conseiller. Pourquoi fais-tu du Javascool et pas du Java ? Si c'est une obligation dans le cadre de l'école, il faut faire avec ses limites : c'est un "langage" destiné à l'apprentissage, fondé sur Java certes, mais limité et simplifié. Si c'est un choix personnel, c'est pareil, ou passer à Java si tu veux faire des choses qu'on ne peut pas faire avec Javascool, mais qu'on peut faire en Java. Sinon, il y a peut-être des forums Javascool où on pourra mieux te guider sur les threads. Si ce sont les threads qui te semblent trop compliqués, tu peux aussi regarder les javax.swing.Timer, mais il ne plus penser ton animation en terme de boucle : un Timer exécute une tâche à intervalle régulier (en utilisant un thread masqué), donc au lieu d'une boucle, il faut faire une action qui déplace, à chaque appel avec un compteur.

    Exemple avec un Timer :

    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
    public class JAnimationPanel extends JPanel implements ActionListener {
     
    	private Timer timer;
    	private int nombreDeFois;
    	private int compteur;
    	private int dx;
    	private int dy;
    	private volatile int x;
    	private volatile int y;
     
    	public JAnimationPanel() {
    		super(true);
    		timer = new Timer(33, this); // un timer qui appelle une action toutes les 33 ms
    		timer.setRepeats(true);
    		setBackground(Color.WHITE);
    	}
     
    	public void start(int x, int y, int dx, int dy, int nombreDeFois) {
    		timer.stop();
    		this.x=x;
    		this.y=y;
    		this.dx=dx;
    		this.dy=dy;
    		this.compteur=0;
    		this.nombreDeFois=nombreDeFois;
    		repaint();
    		if ( nombreDeFois>0 ) {
    			timer.start();		
    		}
    	}
     
    	public void restart() {
    		timer.restart();
    	}
     
    	public void stop() {
    		timer.stop();
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// ici le code qui est éxécuté toutes les 33 ms
    		x+=dx;
    		y+=dy;
    		compteur++;
    		repaint(); // pour redessiner
    		if ( compteur>=nombreDeFois ) {
    			stop();
    		}
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		g.setColor(Color.BLUE);
    		g.fillRect(x, y, 20, 20);
    	}
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel();
    		panel.setLayout(new BorderLayout());
    		frame.getContentPane().add(panel);
     
    		final JAnimationPanel timerpanel = new JAnimationPanel();
    		panel.add( timerpanel, BorderLayout.CENTER);
     
    		JPanel buttonPanel = new JPanel();
    		panel.add( buttonPanel, BorderLayout.SOUTH);
     
    		JButton button1 = new JButton("Lancer");
    		buttonPanel.add( button1 );
    		button1.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				timerpanel.start(0, 0, 1, 0, 100);
    			}
     
    		});
     
    		JButton button2 = new JButton("Stop");
    		buttonPanel.add( button2 );
    		button2.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				timerpanel.stop();
    			}
    		});
     
    		frame.setSize(300, 300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/03/2013, 02h08
  2. Quel layout pour organiser mes boutons dans une JFrame ?
    Par zangaloni dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 31/03/2009, 16h44
  3. [JLabel] Chargement d'image dans une JFrame
    Par mr.t dans le forum Composants
    Réponses: 10
    Dernier message: 27/01/2005, 18h32
  4. [JFrame] affichage de component et d'image dans une JFrame
    Par Joeleclems dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 08/10/2004, 16h17
  5. [FLASH 5]un bouton dans une image pour revenir sur une scene
    Par patato valdes dans le forum Flash
    Réponses: 7
    Dernier message: 28/04/2004, 20h21

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