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 de thread pour des éléments graphiques


Sujet :

Interfaces Graphiques en Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 53
    Points : 37
    Points
    37
    Par défaut Problème de thread pour des éléments graphiques
    Bonjour,

    Pour pouvoir faire une animation simple d'un dessin 2D dessiner avec la méthode paintComponent(Graphics g), j'ai regarder les tutoriels Java, malheureusement en appliquant son tutoriel, lorsque je lance mon appli, il attend que le thread et fini la boucle avant de m'ouvrir mon appli, hors je voulait voir mon anime.

    Voici le code en question:
    mon main.java
    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
     
    import javax.swing.*;
     
    public class Main {
    	private static void creationIG(){
    		AnimThread frame =new AnimThread("Test");
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setSize(400,400);
    		frame.setVisible(true);
    	}
     
    	public static void main(String[] args){
    		javax.swing.SwingUtilities.invokeLater(new Runnable(){
    			public void run(){
    				creationIG();
    			}
    		});//optimise et securise la gestion des processus de l'IG
    	}
    }
    AnimeThread.java
    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
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class AnimThread extends JFrame implements ActionListener{
    	public Dessin dess;
    	public JPanel p;
    	public JButton b;
     
    	public AnimThread(String titre){
    		super(titre);
    		p = new JPanel(new BorderLayout());
    		dess = new Dessin();
    		b = new JButton("Go!!!");
    		p.add(b,BorderLayout.SOUTH);
    		p.add(dess,BorderLayout.CENTER);
    		add(p);
     
    		b.addActionListener(this);	
    	}
     
    	public void actionPerformed(ActionEvent event){
    		Object source =event.getSource();
     
    		if(source.equals(b)){
    			for(int i=0;i<10;i++){
    				int x = dess.PosX,y = dess.PosY;
    				x++;
    				y++;
    				dess.setX(x);
    				dess.setY(y);
    				dess.repaint();
    				try {
                        Thread.sleep(1000);
    				} catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
    				}
    				System.out.println(i);
    			}
    		}
     
    	}
    }
    et dessin.java
    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
    import java.awt.*;
    import javax.swing.*;
     
    public class Dessin extends JPanel{
    	public int PosX = 10;
    	public int PosY = 10;
    	public void paintComponent(Graphics g){
    		super.paintComponent(g);
    		setBackground(Color.black);
    		g.setColor(Color.RED);
    		g.fillRect(PosX, PosY, 20, 20);
     
    	}
    	public void setX(int x){
    		PosX = x;
    	}
    	public void setY(int y){
    		PosY =y;
    	}
    }
    autre question:

    je voudrait créer 2 thread différents, chaque dessine une figure propre a lui même (ex: un cercle), je voudrai savoir comment en faire disparaitre un ( par exemple en appuyant sur un bouton), car tout ce dessine dans la méthode paintComponent.

    dernier question:

    comment superposer 2 fenêtre et que tout sois visible ? (exemple, on a un rond dans la fenêtre 1 et un rectangle dans la 2, pouvoir voir les deux)

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 996
    Points
    7 996
    Par défaut
    Je ne sais pas si j'ai bien compris mais pour le problème 1. Il faut créer un thread pour l'animation. (Et veillez a ne pas en lancer 40000 en parallèle en cliquant sur GO 40000 fois)

    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
    public void actionPerformed(final ActionEvent event)
    	{
    		Thread t = new Thread()
    		{
     
    			public void run()
    			{
     
    				Object source = event.getSource();
     
    				if (source.equals(b))
    				{
    					for (int i = 0; i < 10; i++)
    					{
    						int x = dess.PosX, y = dess.PosY;
    						x++;
    						y++;
    						final int x1 = x;
    						final int y1 = y;
    						SwingUtilities.invokeLater(new Runnable()
    						{
    							public void run()
    							{
    								dess.setX(x1);
    								dess.setY(y1);
    								dess.repaint();
    							}
    						});
     
    						try
    						{
    							Thread.sleep(1000);
    						} catch (InterruptedException e)
    						{
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    						System.out.println(i);
    					}
    				}
    			}
    		};
    		t.start();
     
    	}
    Pour le point 2, je crois qu'il va falloir revoir tout le code mais je me trompe peut etre. Genre tu crée une seule classe dessin qui elle va dessiner toutes les formes. Car la je vois que tu as envie de dupliquer Dessin mais j'ai des doutes que ca fonctionne.

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Sauf qu'il est préférable d'avoir un unique thread gérant l'ensemble des animations, un espèce de controlleur d'animation qui fait les calculs (éventuellement dessine sur une image si besoin est) puis déclenche le repaint du composant qui lui ne doit faire que du dessin et pas de calculs?

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 996
    Points
    7 996
    Par défaut
    100% d'accord avec toi.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    wax78 -> merci pour tes réponse, pour être précis je veux faire bouger des sprite qui descendront tout seul du haut de la fenêtre, ainsi qu'un sprite pour l'élément déplaçable par l'utilisateur.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/05/2010, 16h10
  2. Réponses: 2
    Dernier message: 27/04/2006, 16h45
  3. [SimpleXML] Problème PHP5/XML pour des affichages particuliers
    Par vanilla dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 20/04/2006, 13h22
  4. [CSS] Apparence des éléments graphiques (boutons, ...)
    Par oursblanc dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 28/02/2006, 20h01
  5. problème d'accès a des éléments créés dynamiquement
    Par Pymm dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/07/2005, 17h13

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