Partage
  • Partager sur Facebook
  • Partager sur Twitter

JFrame, JPanel, positionnement

please, I need HELP

    20 mai 2009 à 18:44:29

    Bonjour,

    je cherche pourquoi, mon image de fond n'est pas complétement en haut à gauche. Je me suis inspiré du tuto de Java de cysboy, pour arriver jusque là.

    voici mon soucre :
    classe fenetre, où je crée la fenêtre:
    import java.awt.Color;
    import java.awt.Graphics;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    import java.awt.event.*;
    
    public class Fenetre extends JFrame implements KeyListener
    {
    
        private Panneau aPan;
        
            public Fenetre()
            {
                    this.setTitle("Ma première fenêtre java");
    //                 this.setSize(400, 500);
                    this.setLocationRelativeTo(null);               
     
                    //Instanciation d'un objet JPanel
                    aPan = new Panneau();
                    // position pouis taille de la fenêtre
                    this.setBounds(100, 100, 500, 375);
                    //Définition de sa couleur de fond
                    aPan.setBackground(Color.ORANGE);        
                    //On prévient notre JFrame que ce sera notre JPanel qui sera son contentPane
                    
    //                 this.setLayout(null);
                    this.setContentPane(aPan);
                    this.addKeyListener(this);
                    
                    this.setVisible(true);
                
            }
            
        /**
         * CLAVIER
         */    
        public void keyPressed(KeyEvent pe)
        {
            //System.out.println("clav");
            if(pe.getKeyCode() == pe.VK_RIGHT) 
            {
               aPan.setX(aPan.getX() + 5);
               this.setContentPane(aPan);
            }
            if(pe.getKeyCode() == pe.VK_LEFT) 
            {
                aPan.setX(aPan.getX() - 5);
               this.setContentPane(aPan);
            }
        }
        public void keyReleased(KeyEvent pe)
        {
        }
        public void keyTyped(KeyEvent pe)
        {
        }
    }
    


    et la classe Panneau où je dessine :
    import java.awt.Graphics;
    import java.awt.Image;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
    
     
    public class Panneau extends JPanel
    {
    
            private int aX, aY;
            private int aXd, aYd;
            private Graphics ag;
            private Image aimg;
            
            private Image aimgd1;
            
            public Panneau()
            {
                aX = 50;
                aY = 100;
            }
            
            @Override 
            public void paintComponent(Graphics g)
            {
                this.setLayout(null);
                this.setBounds(10, 300, 500, 375);  
                try {
                      aX = 50;
                      aY = 100;    
                      //System.out.println("bouuhh");
                            ag =g;
                            
                            aimg = ImageIO.read(new File("casino.gif"));
                            aimgd1 = ImageIO.read(new File("charon.gif"));
                            // - - - - nom del'image, posx, posy, taillex, tailley, panel
                            // System.out.println(aimgd1);
                            
                            //Pour une image de fond
                           g.drawImage(aimgd1, 0, 0, this.getWidth(), this.getHeight(), this);
                    
                            g.drawImage(aimg, aX, aY, 50, 50, this);
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                    }
    
            }  
    //         public Panneau getPanneau()
    //         {
    //             return this;
    //         }
            
            public int getX()
            {
                return aX;
            }
            public int getY()
            {
                return aY;
            }
            
            public void setX(int pX)
            {
                if(pX > 150) return;
                else if(pX < 0) return;
                aX = pX;
                this.refresh();
                   
            }
            public void setY(int pY)
            {
                aY = pY;
            }
            
             /**
             * @param la valeur maximale du nombre souhaité en retout
             */
            public int hasard(int pLong)
            {
                int vReturn = 0;
                java.util.Random random1 = new java.util.Random();
                vReturn = (int) (random1.nextDouble() * (pLong) + 1);
                
                return vReturn;
            }
    
            private void refresh()
            {
                 ag.drawImage(aimg, aX, aY, 50, 50, this);
                    
            }
            
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2009 à 19:18:14

      private int aX, aY;
       private int aX, aY;
      
      public Panneau()
              {
                  aX = 50;
                  aY = 100;
              }
              
       
      /************************/
      .....
      
      /***********************/
      
        private void refresh()
        {
                   ag.drawImage(aimg, aX, aY, 50, 50, this);
                    
        }
      


      Je n'ai pas lu tout ton code mais regardes si ça ne viens pas du fait que aX commence à 50 et aY à 100.

      • Partager sur Facebook
      • Partager sur Twitter
        20 mai 2009 à 19:44:24

        en effet, c'est du à ça. Mais je vois pas pourquoi !!
        • Partager sur Facebook
        • Partager sur Twitter
          20 mai 2009 à 19:47:18

          Met aX= 0 et aY= 0 ;
          ça ne marche pas ?
          • Partager sur Facebook
          • Partager sur Twitter
            20 mai 2009 à 19:51:29

            si, mais en faite je souhaite faire bouger l'image en modifiant aX et aY
            • Partager sur Facebook
            • Partager sur Twitter
              20 mai 2009 à 19:52:50

              Si tu fais bouger l'image, il est normal qu'elle n'est plus en 0,0 : je ne te suis pas.
              Si tu veux qu'elle soit en haut à gauche il faut qu'elle soit en 0.0 au départ.
              • Partager sur Facebook
              • Partager sur Twitter
                20 mai 2009 à 20:01:50

                je voudrai que mon image de onf reste, elle, en (0;0).
                L'autre devrais bouger en même temps. Le problème c'est que j'ai besoin de aX et aY, enyant l'image de fond fixe en (0;0).
                • Partager sur Facebook
                • Partager sur Twitter
                  20 mai 2009 à 20:46:57

                  Alors mets 2 images. Une qui reste en 0:0 et l'autre que tu mets où tu veux.

                  PS : si jamais dans ma téci on dit fond et pas onf
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 mai 2009 à 21:04:48

                    Aïe aïe aïe y'a de gros soucis dans ton code. Enfin je ne t'en veux pas, il faut bien apprendre !

                    • Premièrement évite le setBounds, pour parler franchement ça sert à rien.
                    • Ensuite ne redéfinis pas sans arrêt le contentPane() de ta Fenetre. D'ailleurs setContentPane() ne sert à rien non plus.
                    • Puis on évite de référencer un objet Graphics : le seul moment où on peut vraiment utiliser cet objet, c'est dans la méthode paintComponent.
                      En revanche tu peux faire ceci dans ta méthode refresh() :
                      private void refresh(Graphics g)
                      {
                      	g.drawImage(aimg, aX, aY, 50, 50, this);
                      }
                      

                      Puis l'utiliser dans paintComponent en prenant le Graphics passé en paramètre comme ceci :
                      public void paintComponent(Graphics g)
                      {
                      	refresh(g);
                      }
                      
                    • Pendant qu'on parle de paintComponent, dans cette méthode tu ne dois mettre QUE ce qui doit utiliser un objet Graphics. Autrement dit je ne veux pas voir de setLayout(null) dans un paintComponent.
                    • D'ailleurs perso je déteste les blocs try-catch-finally dans un paintComponent, pour la même raison que pour le setLayout(null). Oui ça marche quand même mais ça manque beaucoup de logique (la logique du code joue souvent sur l'intégrité des données, et c'est important en POO, pour ne pas dire fondamental).
                    • Oh oui j'oubliais, on commence toujours par appeler explicitement la méthode paintComponent(Graphics) de la classe mère quand on définit un JComponent perso ^^ Donc première ligne = super.paintComponent(g)


                    Puis pendant que j'y suis je vais résoudre ton problème ^^
                    Tu redéfinis les méthodes getX() et getY() qui sont déjà définies dans la classe JPanel et dont le UI Delegate se sert pour placer les composants. Donc forcément ton JPanel sera toujours décalé ^^ C'est là que c'est bien d'utiliser un IDE qui signale il me semble si l'on veut Override ou non une méthode. Donc pour remédier à cela, change le nom des getters et tout ira mieux, pour l'instant.

                    J'espère ne pas avoir été trop dur avec mes remarques ^^'
                    Point positif dans tout cela : tu as visiblement fait quelques tests et ça c'est très très bien.

                    Alors bon courage dans ton apprentissage ;)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 mai 2009 à 8:51:24

                      Merci énormément, je tiens compte de tes remarques dès maiiiiintenant. J'ai l'impression d'y voir déjà un peu plus claire !!!
                      Le problème, c'est je ne vois pas trop comment acualiser la position de l'image sans setContentPan

                      encore merci
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 mai 2009 à 12:50:29

                        Voilà un petit code qui marche. Il serait bien que tu fasses le parallèle avec ce que tu as essayé de faire pour voir les différences.
                        import java.awt.Graphics;
                        import java.awt.Image;
                        import java.io.File;
                        import java.io.IOException;
                        import javax.imageio.ImageIO;
                        import javax.swing.JPanel;
                        
                        public class Panneau extends JPanel
                        {
                        	private int aX, aY;
                        	private int aXd, aYd;
                        	private Image aimg;
                        	private Image aimgd1;
                        
                        	public Panneau()
                        	{
                        		super();
                        		setPreferredSize(new java.awt.Dimension(500, 375));
                        		aX = 50;
                        		aY = 100;
                        		try {
                        			aimg = ImageIO.read(new File("casino.gif"));
                        			aimgd1 = ImageIO.read(new File("charon.gif"));
                        		} catch (IOException e) {
                        			e.printStackTrace();
                        		}
                        	}
                        
                        	@Override 
                        	public void paintComponent(Graphics g)
                        	{
                        		super.paintComponent(g);
                        		g.drawImage(aimgd1, 0, 0, this);
                        		refresh(g);
                        	}
                        
                        	public int getImageX()
                        	{
                        		return aX;
                        	}
                        	
                        	public int getImageY()
                        	{
                        		return aY;
                        	}
                        	
                        	public void setImageX(int pX)
                        	{
                        		if(pX >= 0 && pX <= 150)
                        		{
                        			aX = pX;
                        			repaint();
                        		}
                        	}
                        	public void setImageY(int pY)
                        	{
                        		aY = pY;
                        		repaint();
                        	}
                        	
                        	/**
                        	 * @param la valeur maximale du nombre souhaité en retout
                        	 */
                        	public int hasard(int pLong)
                        	{
                        		int vReturn = 0;
                        		java.util.Random random1 = new java.util.Random();
                        		vReturn = (int) (random1.nextDouble() * (pLong) + 1);
                        		
                        		return vReturn;
                        	}
                        
                        	private void refresh(Graphics g)
                        	{
                        		 g.drawImage(aimg, aX, aY, this);
                        	}  
                        }
                        

                        import java.awt.Color;
                        import java.awt.Graphics;
                         
                        import javax.swing.JFrame;
                        import javax.swing.JPanel;
                        
                        import java.awt.event.*;
                        
                        public class Fenetre extends JFrame
                        {
                            private Panneau aPan;
                            
                        	public Fenetre()
                        	{
                        		super();
                        		setTitle("Ma première fenêtre java");
                        		setDefaultCloseOperation(EXIT_ON_CLOSE);
                        		setSize(500, 375);
                        		aPan = new Panneau();
                        		add(aPan);
                        		addKeyListener(new KeyAdapter() {
                        			public void keyPressed(KeyEvent pe) {
                        				if(pe.getKeyCode() == pe.VK_RIGHT) 
                        					aPan.setImageX(aPan.getImageX() + 5);
                        
                        				if(pe.getKeyCode() == pe.VK_LEFT) 
                        					aPan.setImageX(aPan.getImageX() - 5);
                        			}
                        		});
                        		setLocationRelativeTo(null);
                        		setVisible(true);
                        	}
                        
                        }
                        

                        En espérant que tu y vois plus clair qu'à travers un long discours.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 mai 2009 à 13:02:13

                          merci, c'est vraiment gentil.

                          En effet l'utilisation du constructeur est plus pratique !! il me manquer la méthode repaint(), très utile

                          c'est super. Tout cela n'est que le début d'un moteur graphique, SpaceInvider !

                          merci
                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 mai 2009 à 13:07:29

                            Space Invaders hein ? :)
                            Si l'anglais ne t'effraie pas regarde par ici : http://www.cokeandcode.com/node/6
                            Y'a pas mal de conseils utiles pour débuter dans les petits jeux.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            JFrame, JPanel, positionnement

                            × 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