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

2D Java Discussion :

Deux JPanel, un JLayredPanel, draw et Set Location


Sujet :

2D Java

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut Deux JPanel, un JLayredPanel, draw et Set Location
    Bonjour a tous !
    J'vous présente vite fait la structure de mon interface...

    Donc j'ai un JLayredPanel, contenant deux Panel
    L'un de ces Panel représente le fond (on va l'appeler PanelFond)
    Le second représente un personnage (on va l'appeler Personnage)
    Personnage est en fait un ImagePanel avec dessiné dessus a son initialisation l'image du personnage

    Donc en fait je dessine progressivement un chemin sur PanelFond (avec DrawLine)
    En même temps que je dessine ce chemin, j'aimerai déplacer le personnage... J'utilise donc SetLocation sur mon panel pour déplacer celui ci.
    Premier probleme: Mon personnage ne se déplace pas progressivement, il ne s'affiche qu'a sa position de départ, puis sa position d'arrivée (probleme de repaint ?)

    Second probleme: Lors de l'utilisation de SetLocation sur le panel Personnage, tout ce qui est dessiné sur PanelFond est effacé... Est-ce normal ?

    Voici mon ImagePanel (avec BG transparent) :
    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
    package logogui;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
     
    import javax.swing.ImageIcon;
    import javax.swing.JPanel;
     
    class ImagePanel extends JPanel {
     
      private Image img;
     
      public ImagePanel(String img) {
        this(new ImageIcon(img).getImage());
      }
     
      public ImagePanel(Image img) {
        this.img = img;
        Dimension size = new Dimension(70, 84);
    	setBackground(new Color(0,0,0,255));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);
      }
     
      public void paintComponent(Graphics g) {
    	  g.drawImage(img, 0, 0, null);
      }
    }
    Ici le MyJLayredPane (modifié pour ajouté des attributs de classe) :
    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
    import java.awt.Color;
    import javax.swing.ImageIcon;
    import javax.swing.JLayeredPane;
    import javax.swing.JPanel;
     
    public class MyJLayeredPane extends JLayeredPane {
     
    	private JPanel cheminPanel;
    	private ImagePanel perso;
    	private static double initx = 300;   // position initiale
    	private static double inity = 300;
    	private static int persoHeight = 84;
    	private static int persoWidth = 75;
     
    	public MyJLayeredPane()
    	{
    		cheminPanel = new JPanel();		
    		cheminPanel.setBounds(0,0,2000,2000);
    		add(cheminPanel,new Integer(0));	
     
    		perso = new ImagePanel(new ImageIcon("images\\perso.png").getImage());		 
    		perso.setSize(persoWidth, persoHeight);
    		perso.setBounds(toInt(initx)-persoWidth/2,toInt(inity)-persoHeight/2,persoHeight,persoHeight);
    		add(perso,new Integer(1));
    	}
     
    	public void init()
    	{
    		cheminPanel = new JPanel();
    		cheminPanel.setBounds(0,0,2000,2000);
    		add(cheminPanel,new Integer(0));	
     
    		perso = new ImagePanel(new ImageIcon("images\\perso.png").getImage());
    		perso.setSize(persoWidth, persoHeight);
    		perso.setBounds(toInt(initx)-persoWidth/2,toInt(inity)-persoHeight/2,persoHeight,persoHeight);
    		add(perso,new Integer(1));	
    	}
     
    	public JPanel getCheminPanel()
    	{
    		return cheminPanel;
    	}
     
    	public ImagePanel getPerso()
    	{
    		return perso;
    	}
     
    	private static int toInt(double a) {
    		return (int) Math.round(a);
    	}
    }
    Et la fonction qui dessine:
    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
    public void move(int r) 
    	{
     
    		for(int i = r; i > 0; i = i - 5)
    		{
    			double a, b ;
    			if(i < 5)
    			{
    				a = posx + i  * Math.cos(teta) ;
    				b = posy - i * Math.sin(teta) ;
    			}
    			else
    			{
    				a = posx + 5  * Math.cos(teta) ;
    				b = posy - 5 * Math.sin(teta) ;
    			}
    			int x1 = posx;
    			int y1 = posy;
    			int x2 = a;
    			int y2 = b;
     
    			perso.setLocation(x2-persoWidth/2,y2-persoHeight/2);
    			g2d.drawLine(x1,y1,x2,y2);	
     
    			posx = a;
    			posy = b;	
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
    		}
     
    	}
    }
    Grosso modo, dans cette fonction, le personnage se déplace de 'r' pixels
    Je le fais se déplacer de 5px par 5px
    Donc on a bien le chemin qui se trace (g2d.DrawLine) avec g2d obtenu par getGRaphics() du panel FondPanel (aussi appelé CheminPanel)
    J'ai donc les 5 pixels dessiné toutes les 100ms.
    Par contre, le setLocation n'est effectué qu'a la fin de la boucle, et efface tout ce qui a été dessiné sur le FondPanel...

    Aidez moiiii

    Merci d'avance ^^

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le getGraphics pour les JComponents c'est maaaaaaaaal

    Plus sérieusement, pour dessiner sur un JComponent il FAUT (et c'est impératif) que le contexte graphique soit celui fourni par la méthode paintComponent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class MonDessin extends JPanel {
       private int x1,x2,y1,y2;
       protected void paintComponent(Graphics g) {
          g.drawLine(x1,y1,x2,y2);    
       }  
    }
    Et pour ta temporisation il ne faut en AUCUN cas faire de temporisation avec un Thread.sleep dans le thread UI sous peine de tout bloquer.

    Pour exécuter une action toutes les x millisecondes tu ferais mieux de passer par un timer Swing qui appellerait la fonction move (qui ne ferait plus que du pur calcul) puis enchainerait avec un repaint et le tour est joué.

Discussions similaires

  1. (GUI Builder) Coller deux JPanel
    Par Mattgic dans le forum NetBeans
    Réponses: 2
    Dernier message: 16/10/2009, 16h31
  2. Afficher un meme objet sur deux Jpanel différents
    Par Kehel dans le forum Débuter
    Réponses: 3
    Dernier message: 04/09/2008, 14h21
  3. Deux JPanel dans une fenetre
    Par codesig dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 11/08/2007, 16h08
  4. [JPanel] Deux JPanel dans une fenêtre
    Par cysboy dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 04/09/2006, 16h02
  5. JPanel contenant deux JPanel definir taille de l un d eux
    Par mereyj dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 20/06/2005, 21h40

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