Partage
  • Partager sur Facebook
  • Partager sur Twitter

Réalisation d'un applet java

impossible d'animer un JPanel dans un JApplet

    11 novembre 2008 à 15:02:19

    je suis en train d'apprendre à réaliser un applet java, je travaille sous éclipse.je voudrais animer un rectangle, donc le bouger d'un endroit à un autre. Pour se faire, j'ai écrit une classe rectangle qui hérite de JPanel, ensuite j'ai redéfinit la méthode paintComponent comme ceci:

    public class Rectangle extends JPanel{
    
        private int posX = 100;
        private int posY = 200;
        
        public void paintComponent(Graphics g){
                g.setColor(Color.red);
                g.drawRect(posX, posY, 100, 23);
        }
    
        
        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;
        }
    }
    


    Ensuite, dans mon applet j'ai un attribut Rectangle monRect = new Rectangle()et je fait
    this.setContentPane(monRect);
    
    impec. J'appelle ensuite une méthode "deplacer" qui change les coordonnées de mon rectange avec les méthodes de la clase Rectangle et repaint le rectangle, tout ça dans une boucle comme ceci:
    public void deplacer(){ 
         int count = 10 // juste pour rentrer dans la boucle
         while(count>2){
             count = cell.getPosY(); count--; cell.setPosY(count);
             cell.repaint();
             try {
    	     Thread.sleep(8);
    	 } catch (InterruptedException e) {
    	      e.printStackTrace();
    	   }
          }
         }
    

    Je change juste la coordonnée y, => dépacement vertical.
    Le problème et que l'applet ne s'affiche qu'après avoir fait toute la boucle,je ne vois donc mon rectangle qu'une fois arrivé à l'emplacement finale. Dans un JFrame celà marche bien. comment faire?
    • Partager sur Facebook
    • Partager sur Twitter
      11 novembre 2008 à 19:03:25

      J'ai le même problème, quelqu'un a une solution ?
      • Partager sur Facebook
      • Partager sur Twitter
        12 novembre 2008 à 15:24:52

        Bonjour,

        Il suffit de mettre votre déplacement dans un thread à part...
        Les applets sont un peu différentes que les Frame à ce niveau...

        Voici un code qui fonctionne avec ta classe Rectangle :

        package Test;
        
        import javax.swing.JApplet;
        import javax.swing.JFrame;
        
        public class Fenetre extends JApplet implements Runnable{
        
        	private Rectangle cell;
        	
        	public Fenetre() {
        		this.setSize(500, 300);
        		this.cell = new Rectangle();
        		this.setContentPane(this.cell);
        		
        		Thread t = new Thread(this);
        		t.start();
        	}
        
        	public void deplacer(){ 
        	     int count = 10; // juste pour rentrer dans la boucle
        	     while(count>2){
        	         count = cell.getPosY(); 
        	         count--; 
        	         cell.setPosY(count);
        	         cell.repaint();
        	         try {
        		     Thread.sleep(8);
        		 } catch (InterruptedException e) {
        		      e.printStackTrace();
        		 }
        	  }
        	}
        	
        	public void run() {
        		deplacer();
        	}
        }
        


        Par contre, tu ne redessine pas le fond de ton conteneur => ton déplacement est donc faussé... Il faudrait soit dessiner un rectangle au fond de ton conteneur avant de dessiner le rectangle, soit appeler la méthode paintComponent() de JPanel avec le mot clé super en début de méthode...
        • Partager sur Facebook
        • Partager sur Twitter
          13 novembre 2008 à 10:30:12

          Bonjour
          J'ai eu tort de marquer ce sujet comme résolu. J'ai encore eu un problème,Mai c'était gentil à cysboy de me répondre si vite.Au fait j'ai trouvé une autre alternative que cell d'utiliser un thread,sauf que le problème que j'ai se présente dans les deux solutions: un petit rappel de mon code,
          -J'ai une classe TableCell(avant elle s'appelait rectangle :p ) qui dessine juste un rectangle que je vais devoir animer,voici la classe:
          import java.awt.BasicStroke;
          import java.awt.BorderLayout;
          import java.awt.Color;
          import java.awt.Graphics;
          import java.awt.Panel;
          
          import javax.swing.JLabel;
          import javax.swing.JPanel;
          
          public class TableCell extends JPanel{
          
              private int posX = 100;
              private int posY = 200;
             
              public  TableCell(){
              	    super();
              }	  
              	   
              public void paintComponent(Graphics g){
              	
                      g.setColor(Color.DARK_GRAY);
                      g.fillRect(0, 0, this.getWidth(), this.getHeight());
                      g.setColor(Color.red);
                      g.drawRect(posX, posY, 100, 23);
              }
          
              
              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;
              }
          }
          

          ensuite J'ai une autre classe Panel ou je mets toutes me composantes que je souhaite avoir dans mon applet(des JBouton,JLabel,JTable...).La classe panel a également une méthode
          void AddCellToAnimate()qui crée un TableCell (donc un rectangle) et le déplace tout simplement.
          Je voudrais qu'au click d'un de mes bouton la méthode void AddCellToAnimate(), soit appellée, c'est ce que je fait dans actionPerformed(ActionEvent arg0). En fin, dans mon applet j'ai juste un attribut Panel panneau qui contien donc tout et je le setcomtentPane de l'applet. Voici la classe Panel:
          import java.awt.BorderLayout;
          import java.awt.Color;
          import java.awt.TextField;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import java.awt.event.ComponentListener;
          
          import javax.swing.JButton;
          import javax.swing.JFrame;
          import javax.swing.JLabel;
          import javax.swing.JPanel;
          import javax.swing.JTable;
          import javax.swing.event.AncestorListener;
          
          /* Cette classe contien toutes les composantes
             que souhaite avoir dans mon applet*/
          
          public class Panel extends JPanel{
          	
          	private JLabel tapper = new JLabel("Tappez un mot");
          	private JLabel generer = new JLabel("générez un mot");
          	private JButton Inserer = new JButton("Insérer");
          	private JButton genbouton = new JButton("générer");
          	public TextField text = new TextField("mot par défaut");
          	private JTable table1;
          	private JTable table2;
          	private String[] colomnName = {"valeur"};          
          	private Object[][] data = {{""},{""},{""},{""},{""},{""},{""},{""},{""},{""}}; 
          	private Thread t;
          
          	
              public Panel() {
          		 super();
          		 InitPanel();
          	}
          	public void InitPanel() {
          		
          		// initialisation de tables
          		
          		table1= new JTable(data, colomnName);table1.setRowHeight(23);
          		table2= new JTable(data, colomnName);table2.setRowHeight(23);
          		table1.getColumnModel().getColumn(0).setPreferredWidth(100);
          		table2.getColumnModel().getColumn(0).setPreferredWidth(100);
                  
          		// ajouter les composantes dans le panneau
          		
          		this.setLayout(new BorderLayout());
          		this.add(table1.getTableHeader(), BorderLayout.PAGE_START);
          		this.add(table1,BorderLayout.WEST);
          		this.add(table2.getTableHeader(), BorderLayout.EAST);
          		this.add(table2,BorderLayout.EAST);
          		JPanel down = new JPanel();
          		down.add(tapper);
          	        down.add(text);
          		down.add(Inserer);
          		down.add(generer);
          		down.add(genbouton);
          		this.add(down,BorderLayout.SOUTH); 
          		this.setBackground(Color.DARK_GRAY);
          		Inserer.addActionListener(new Ecouter1());
          		genbouton.addActionListener(new Ecouter2());
          	 }	
          	
          		// l'écouteur du bouton "Inserer"
          		class Ecouter1 implements ActionListener{
                      public void actionPerformed(ActionEvent arg0) {        
                             System.out.println("Vous avez tappé " + (text.getText()));
                             text.setText("");
                             t = new Thread(new PlayAnimation());
                             t.start();
          
                      }
                   }
          		
          		// l'écouteur du bouton "genbouton"
          		class Ecouter2 implements ActionListener{
                      public void actionPerformed(ActionEvent arg0) {                       
                             text.setText("cadeau");  
                             
                      }            
                   }
          		
          		class PlayAnimation implements Runnable{
          			 
                      @Override
                      public void run() {
                      	AddCellToAnimate();                   
                      }               
                  }       
          		
          
          	
              public void AddCellToAnimate(){
              	TableCell cell = new TableCell();
          		this.add(cell);
          		Animate(cell);
          	}
          	
          	public void Animate(TableCell cell){ 
          		int count =250;	
          		while(count>2){
          			count = cell.getPosX(); count--; cell.setPosX(count);
          			count = cell.getPosY(); count--; cell.setPosY(count);
          			cell.repaint();
          			try {
          				Thread.sleep(18);
          			} catch (InterruptedException e) {
          				// TODO Auto-generated catch block
          				e.printStackTrace();
          			}
          		}
          	}	
          }
          

          et voici mon applet:
          import java.awt.BorderLayout;
          	import java.awt.Color;
          	import java.awt.TextField;
          	import java.awt.event.ActionEvent;
          	import java.awt.event.ActionListener;
          	import java.awt.event.ComponentListener;
          	import java.awt.event.ContainerListener;
                import javax.swing.*;
          
          	public class CououApplet extends JApplet {
          		
          		private Panel panneau = new Panel();		
          		public void init(){
          			
          			this.setSize(450,300);	
          
          			this.setContentPane(panneau);
          			this.setVisible(true);
          		
          			
          		}
          
          
          	}
          

          Le pro est que quand j'appelle la méthode AddCellToAnimate() sur panneau directement dans l'applet,
          panneau. AddCellToAnimate()
          
          ça marche impec, le rectangle bouge.Mais, quand je clique sur le bouton,je vois rien sauf quand je bouge un peu la fenêtre de mon applet ou je clique sur son bord, là je vois mon rectangle se déplacer. C bizarre.J'ai même essayé la solution de cysboy (de faire un thread) mais ça ne change rien. La question est un peu kilométrique,j'espère que vous ne m'en voudrez pas. Merci bcp.
          • Partager sur Facebook
          • Partager sur Twitter

          Réalisation d'un applet 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