Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bug ardoiZ

    3 février 2010 à 13:29:24

    Bonjour, j'ai voulu faire le tp de l'ardoise magic dans le tuto java et je sais pas pourquoi tout fonctionne mais j'ai un bug, la barre de menu et le barre d'outil en haut apparait 2 fois lorsque je clique sur la surface pour dessiner.
    Je vous donne mon code pour que vous voyez le problème par vous même, dites moi ce qui ne va pas si vous savez.
    public class Main {
    
    	public static void main(String[] args) {
    		Fenetre fen = new Fenetre();
    	}
    }
    

    import java.awt.Graphics;
    import java.awt.Color;
    
    import javax.swing.JPanel;
    
    public class Panneau extends JPanel{
    
    	private int posX = -100;
    	private int posY = -100;
    	private String couleur = "ROUGE";
    	private String forme = "ROND";
    	
    	public Panneau(){
    		
    	}
    	
    	public void paintComponent(Graphics g){
    		
    		if(this.couleur == "ROUGE")
    			g.setColor(Color.red);;
    		if(this.couleur == "BLEU")
    			g.setColor(Color.blue);;
    		if(this.couleur == "VERT")
    			g.setColor(Color.green);
    		if(this.couleur == "BLANC")
    			g.setColor(Color.white);
    		if(this.forme == "ROND")
    			g.fillOval(posX, posY, 10, 10);
    		if(this.forme == "CARRE")
    			g.fillRect(posX, posY, 10, 10);
    	}
    
    	
    	public int getPosX(){
    		return this.posX;
    	}
    	
    	public void setPosX(int posX){
    		this.posX = posX;
    	}
    	
    	public int getPosY(){
    		return this.posY;
    	}
    	
    	public void setPosY(int posY){
    		this.posY = posY;
    	}
    	
    	public String getForme(){
    		return this.forme;
    	}
    	
    	public void setForme(String forme){
    		this.forme = forme;
    	}
    	
    	public String getCouleur(){
    		return this.couleur;
    	}
    	
    	public void setCouleur(String couleur){
    		this.couleur = couleur;
    	}
    }
    

    import javax.swing.JFrame;
    import javax.swing.JMenuBar;
    import javax.swing.JMenu;
    import javax.swing.JMenuItem;
    import javax.swing.JToolBar;
    import javax.swing.JPanel;
    import javax.swing.JButton;
    import javax.swing.ImageIcon;
    
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.awt.event.MouseMotionListener;
    import java.awt.event.MouseEvent;
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.Color;
    
    public class Fenetre extends JFrame{
    
    	private JPanel container = new JPanel();
    	private JPanel menuDuHaut = new JPanel();
    	private Panneau pan = new Panneau();
    	
    	private JMenuBar bar = new JMenuBar();
    	private JMenu fichier = new JMenu("Fichier"),
    	edition = new JMenu("Edition"),
    	formePoint = new JMenu("Forme du pointeur"),
    	couleurPoint = new JMenu("Couleur du pointeur");
    	
    	private JMenuItem effacer = new JMenuItem("Effacer"),
    	quitter = new JMenuItem("Quitter"),
    	rond = new JMenuItem("Rond"),
    	carre = new JMenuItem("Carre"),
    	rouge = new JMenuItem("Rouge"),
    	vert = new JMenuItem("Vert"),
    	bleu = new JMenuItem("Bleu");
    	
    	private JToolBar tb = new JToolBar();
    	private JButton bRond = new JButton(new ImageIcon("images/rond.jpg")),
    	bCarre = new JButton(new ImageIcon("images/carre.jpg")),
    	bVert = new JButton(new ImageIcon("images/vert.jpg")),
    	bBleu = new JButton(new ImageIcon("images/bleu.jpg")),
    	bRouge = new JButton(new ImageIcon("images/rouge.jpg")),
    	bGomme = new JButton("Gomme");
    	
    	private BorderLayout bl = new BorderLayout();
    	
    	public Fenetre(){
    		
    		this.setTitle("PhotoshopRobin");
    		this.setSize(400, 400);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    		initBar();
    		initOutils();
    		
    		this.container.setBackground(Color.white);
    		this.pan.addMouseMotionListener(new DeplacementSouris());
    		
    		this.menuDuHaut.setLayout(new GridLayout(2, 1));
    		this.menuDuHaut.add(bar);
    		this.menuDuHaut.add(tb);
    		
    		this.container.setLayout(bl);
    		this.container.add(menuDuHaut, BorderLayout.NORTH);
    		this.container.add(pan, BorderLayout.CENTER);
    		
    		this.setContentPane(container);
    		this.setVisible(true);
    	}
    	
    	public void initBar(){
    		
    		this.fichier.add(effacer);
    		this.fichier.add(quitter);
    		this.formePoint.add(rond);
    		this.formePoint.add(carre);
    		this.couleurPoint.add(vert);
    		this.couleurPoint.add(bleu);
    		this.couleurPoint.add(rouge);
    		this.edition.add(formePoint);
    		this.edition.add(couleurPoint);
    		this.bar.add(fichier);
    		this.bar.add(edition);
    		
    		this.effacer.addActionListener(new EffacerListener());
    		this.quitter.addActionListener(new QuitterListener());
    		this.rond.addActionListener(new RondListener());
    		this.carre.addActionListener(new CarreListener());
    		this.rouge.addActionListener(new RougeListener());
    		this.bleu.addActionListener(new BleuListener());
    		this.vert.addActionListener(new VertListener());
    	}
    	
    	public void initOutils(){
    		
    		this.bRond.addActionListener(new RondListener());
    		this.bCarre.addActionListener(new CarreListener());
    		this.bRouge.addActionListener(new RougeListener());
    		this.bBleu.addActionListener(new BleuListener());
    		this.bVert.addActionListener(new VertListener());
    		this.bGomme.addActionListener(new GommeListener());
    		
    		this.tb.add(bRond);
    		this.tb.add(bCarre);
    		this.tb.add(bVert);
    		this.tb.add(bBleu);
    		this.tb.add(bRouge);
    		this.tb.add(bGomme);
    		this.bar.add(tb, BorderLayout.SOUTH);
    	}
    	
    	public class EffacerListener implements ActionListener{
    		public void actionPerformed(ActionEvent e){
    			pan.setPosX(-100);
    			pan.setPosY(-100);
    			pan.repaint();
    		}
    	}
    	
    	public class QuitterListener implements ActionListener{
    		public void actionPerformed(ActionEvent e){
    			System.exit(0);
    		}
    	}
    	
    	public class RondListener implements ActionListener{
    		public void actionPerformed(ActionEvent e){
    			pan.setForme("ROND");
    		}
    	}
    	
    	public class CarreListener implements ActionListener{
    		public void actionPerformed(ActionEvent e){
    			pan.setForme("CARRE");
    		}
    	}
    	
    	public class RougeListener implements ActionListener{
    		public void actionPerformed(ActionEvent e){
    			pan.setCouleur("ROUGE");
    		}
    	}
    	
    	public class BleuListener implements ActionListener{
    		public void actionPerformed(ActionEvent e){
    			pan.setCouleur("BLEU");
    		}
    	}
    	
    	public class VertListener implements ActionListener{
    		public void actionPerformed(ActionEvent e){
    			pan.setCouleur("VERT");
    		}
    	}
    	
    	public class GommeListener implements ActionListener{
    		public void actionPerformed(ActionEvent e){
    			pan.setCouleur("BLANC");
    		}
    	}
    	
    	public class DeplacementSouris implements MouseMotionListener{
    		
    		public void mouseMoved(MouseEvent e){
    		}
    		
    		public void mouseDragged(MouseEvent e){
    			pan.setPosX(e.getX());
    			pan.setPosY(e.getY());
    			pan.repaint();
    		}
    	}
    }
    

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      3 février 2010 à 23:47:41

      Citation

      if(this.couleur == "ROUGE")
      			g.setColor(Color.red);;
      


      Un seul point virgule.
      Comparaison de String avec "equals" et non "==".
      Toujours mettre super.paintComponent(g) dans la méthode paintComponent().

      Remarque utile : public class DeplacementSouris implements MouseMotionListener
      Tu pourrais faire public class DeplacementSouris extends MouseMotionAdapter et ne redéfinir que mouseDragged().
      • Partager sur Facebook
      • Partager sur Twitter
        4 février 2010 à 1:17:54

        bien vu pour le point virgule de trop, j'ai modifié les equals aussi mais toujours le bug... pour ce qui est des equals j'ai toujours du mal à comprendre le différence entre "==" et "equals" sinon pour le super.paintComponent(g) c'est quoi?
        • Partager sur Facebook
        • Partager sur Twitter
          4 février 2010 à 19:23:41

          C'est simple, en Java tu manipules des objets et des types primitifs.
          Pour comparer deux types primitifs, tu utilises == car cet opérateur compare les emplacements mémoire.
          Pour comparer deux objets, ça ne marche plus l'emplacement mémoire puisque Java travaille avec des références, donc à priori (du moins autant que je sache) deux objets n'auront jamais le même emplacement mémoire.
          Ainsi pour comparer deux objets, on redéfinis la méthode public boolean equals(Object) en définissant les règles de comparaison pour les objets issus de la classe.
          Il se trouve que la classe String est relativement très bien fournie et donc la méthode equals() y est très bien redéfinie.

          En résumé, les objets se comparent avec equals(), les primitifs (comme int, double, float, char, etc) avec ==.
          Quant à super.paintComponent(g), ben c'est un simple appel à la méthode paintComponent() située dans la classe mère. Si tu ne sais pas ça, tu devrais arrêter la programmation évènementielle ;)
          Si tu veux savoir pourquoi on doit le faire, c'est relativement compliqué à expliquer. Si tu ne le fais pas, il y'a des mécanismes qui ne se font pas et ça cause pas mal de bugs durs à déceler...
          • Partager sur Facebook
          • Partager sur Twitter
            4 février 2010 à 20:08:22

            Ok ok merci, pour ce qui est de super.paintComponent(g) ils n'en parlent pas dans le tuto java du sdz donc ça me paraît étonnant, j'imagine alors que tous ceux qui suivent le tuto ont un bug puisqu'on ne connaît pas super.paintComponent(g).
            En plus, j'ai essayé en mettant super.paintComponent(g) et ça m'apporte un autre problème, le "pan" où l'utilisateur est sensé dessiné, n'est plus blanc, il reste gris et on ne peut plus dessiner...
            Bien compliqué tout ça...
            • Partager sur Facebook
            • Partager sur Twitter
              6 février 2010 à 23:41:56

              Ce n'est pas un autre problème que t'apporte le super.paintComponent(), mais la bonne manière de faire les choses.
              Le problème c'est la méconnaissance générale des programmeurs face au système très complexe de Swing.

              S'il reste gris comme tu dis, c'est parce qu'il n'est pas visible. Ou du moins il est très petit.
              Pour cela fais un setPreferredSize(Dimension) dessus.
              • Partager sur Facebook
              • Partager sur Twitter

              Bug ardoiZ

              × 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