Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide sur le cours des animation Java

l'affichage s'arrête

Sujet résolu
    21 mai 2019 à 1:54:32

    Salut,

    Je fais le chapitre Créez votre propre animation. Je rencontre un problème dans l'affichage de ma fenêtre.

    Je vous passe mes classes

    package desktop;
    
    import javax.swing.JFrame;
    
    public class Fenetre extends JFrame {
    	
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private Panneau pan = new Panneau();
    
    	public Fenetre()
    	{
    		this.setVisible(true);
    		this.setSize(300, 300);
    		this.setTitle("Ma première fenêtre");
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
    		this.setContentPane(pan);
    		go();
    	}
    	
    	private void go()
    	{
    		while(true)
    		{
    			int x = pan.getX(), y = pan.getY();
    			x++;
    			y++;
    			
    			pan.setX(x);
    			pan.setY(y);
    			pan.repaint();
    			
    			System.out.print(pan.toString() + "\n");
    			
    			try {
    				Thread.sleep(16);
    			}
    			catch(InterruptedException e)
    			{
    				System.out.print(e.getMessage());
    			}
    		}
    	}
    }
    
    package desktop;
    
    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.JPanel;
    
    public class Panneau extends JPanel{
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private int posX = 0;
    	private int posY = 0;
    	
    	public void paintComponent(Graphics g) {
    		g.setColor(Color.WHITE);
    		g.fillRect(0, 0, this.getWidth(), this.getHeight());
    		
    		g.setColor(Color.RED);
    		g.fillOval(this.posX, this.posY, 50, 50);
    	}
    	
    	public String toString()
    	{
    		return "x:" + this.posX + " y:" + this.posY;
    	}
    	
    	public void setX(int x)
    	{
    		this.posX = x;
    	}
    	
    	public void setY(int y)
    	{
    		this.posY = y;
    	}
    
    	public int getX()
    	{
    		return this.posX;
    	}
    
    	public int getY()
    	{
    		return this.posY;
    	}
    }

    J'ai cherché d'où viens le problème mais je ne mis connais pas avec swing.

    • Partager sur Facebook
    • Partager sur Twitter

    La persévérance est ma vertu.

      21 mai 2019 à 17:25:01

      Bonjour, 

      A priori le code n'est pas correct dans la classe panneau et dans la méthode go. Essaye ce code qui marche :

      import java.awt.BorderLayout;
      import java.awt.Color;
      import java.awt.Graphics;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
       
      public class Testjframe15 {
      	  public static void main(String[] args){
      
      		  Testjframe1 fen = new Testjframe1();
      	  
      		
      	  }
      }
      
       public class Panneau extends JPanel {
      
      	  /**
      	 * 
      	 */
      	private static final long serialVersionUID = 1L;
      	private int posX = -50;
      	  private int posY = -50;
      
      	  public void paintComponent(Graphics g) {
      	    // On décide d'une couleur de fond pour notre rectangle
      	    g.setColor(Color.white);
      	    // On dessine celui-ci afin qu'il prenne tout la surface
      	    g.fillRect(0, 0, this.getWidth(), this.getHeight());
      	    // On redéfinit une couleur pour notre rond
      	    g.setColor(Color.red);
      	    // On le dessine aux coordonnées souhaitées
      	    g.fillOval(posX, posY, 50, 50);
      	  }
      
      	  public int getPosX() {
      	    return posX;
      	  }
      
      	  public void setPosX(int posX) {
      	    this.posX = posX;
      	  }
      
      	  public int getPosY() {
      	    return posY;
      	  }
      
      	  public void setPosY(int posY) {
      	    this.posY = posY;
      	  }
      	}
      
       public class Testjframe1 extends JFrame {
      	  /**
      	 * 
      	 */
      	private static final long serialVersionUID = 1L;
      	private Panneau pan = new Panneau();
      
      	  ;
      	  private JPanel container = new JPanel();
      	 
      	
      	 
      	  private boolean animated = true;
      	  private boolean backX, backY;
      	  private int x, y;
      	  
      
      	  public Testjframe1(){
      		  this.setTitle("Animation");
      		    this.setSize(300, 300);
      		    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      		    this.setLocationRelativeTo(null);
      		    container.setBackground(Color.white);
      		    container.setLayout(new BorderLayout());
      		    container.add(pan, BorderLayout.CENTER);
      		    
      		    this.setContentPane(container);
      		    this.setVisible(true);    
      		    go();
      		  }
      	    
      	  
      	
      	  
      	  private void go() {
      		    // Les coordonnées de départ de notre rond
      		    int x = pan.getPosX(), y = pan.getPosY();
      		    // Le booléen pour savoir si l'on recule ou non sur l'axe x
      		    boolean backX = false;
      		    // Le booléen pour savoir si l'on recule ou non sur l'axe y
      		    boolean backY = false;
      
      		    // Dans cet exemple, j'utilise une boucle while
      		    // Vous verrez qu'elle fonctionne très bien
      		    while (true) {
      		      // Si la coordonnée x est inférieure à 1, on avance
      		      if (x < 1)
      		        backX = false;
      		      // Si la coordonnée x est supérieure à la taille du Panneau moins la taille du rond, on recule
      		      if (x > pan.getWidth() - 50)
      		        backX = true;
      		      // Idem pour l'axe y
      		      if (y < 1)
      		        backY = false;
      		      if (y > pan.getHeight() - 50)
      		        backY = true;
      
      		      // Si on avance, on incrémente la coordonnée
      		      // backX est un booléen, donc !backX revient à écrire
      		      // if (backX == false)
      		      if (!backX)
      		        pan.setPosX(++x);
      		      // Sinon, on décrémente
      		      else
      		        pan.setPosX(--x);
      		      // Idem pour l'axe Y
      		      if (!backY)
      		        pan.setPosY(++y);
      		      else
      		        pan.setPosY(--y);
      
      		      // On redessine notre Panneau
      		      pan.repaint();
      		      // Comme on dit : la pause s'impose ! Ici, trois millièmes de seconde
      		      try {
      		        Thread.sleep(3);
      		      } catch (InterruptedException e) {
      		        e.printStackTrace();
      		      }
      		    }
      		  }
      		}
       



      -
      Edité par Nemo404 21 mai 2019 à 17:52:23

      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2019 à 1:37:33

        J'ai trouvé la réponse à ma question. 

        Dans ma classe Panneau j'ai créé une méthode getX() qui existait déjà dans le JPanel. J'ai corrigé le nom de la fonction en getPosX(). J'ai fais la même opération pour getY().

        • Partager sur Facebook
        • Partager sur Twitter

        La persévérance est ma vertu.

        Aide sur le cours des animation Java

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown