2016-05-07 1 views
0

Je crée ceci pour dessiner un poisson lorsque la souris est pressée aux coordonnées x et y de la souris. mais il me semble que la méthode du drawfish n'est pas appelée. Je ne peux pas trouver la raison pour laquelle ça ne marche pas. Je serais très reconnaissant pour toute aide.Java Mousepress() pour dessiner des images

/*FishTank*/ 
    import java.awt.Graphics; 
    import javax.swing.JComponent; 
    import javax.swing.JFrame; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import java.awt.*; 
    import java.awt.geom.*; 
    /*FishTank class-contains a frame and the WinstonCanvas.*/ 
    public class FishTank{ 

    public static void main (String[] args){ 
     javax.swing.SwingUtilities.invokeLater(new Runnable(){ 
    public void run(){ 
      JFrame window = new JFrame(); 
      window.setTitle("Fish Tank"); 
      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      window.setBounds(30, 30, 700, 430); 
      window.getContentPane().add(new FishTankCanvas()); 
      window.setVisible(true); 
     } 
     }); 
    } 
    } 
    /*FishTankCanvas is a component that allows drawing shapes.*/ 
    class FishTankCanvas extends JComponent { 
    static Graphics2D g; 
    int x = 11; 
    Timer myTimer; 
    public FishTankCanvas(){ 
     myTimer = new Timer (2, new ActionListener(){ 
     public void actionPerformed (ActionEvent evt){ 
      repaint(); 
     } 
     }); 
     myTimer.start(); 
    } 

    public void paint(Graphics graphics) { 
     g = (Graphics2D)graphics; 
     //makes the background white 
     Color backgroundColor = new Color(89, 216, 255);//light blue 
     g.setColor(backgroundColor); 
     g.fillRect(0,0,this.getWidth(),this.getHeight()); 

     // drawfish (Graphics graphics, int bodyX, int bodyY, int   bodyLength,int bodyHeight, int tailwidth, int eyesize,int tailcolor, int bodycolor) 

     // Mouselistener and mouseadapter 
     this.addMouseListener (new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      //call drawfish method 
      drawfish(FishTankCanvas.g,e.getX(), e.getY(),118,74,1,((int)   (Math.random()*(4 - 0)))); 
      repaint(); 
     } 
     }); 

     // x coordinate plus 1 of fish (animate) 
     x= x + 1; 
    } 
    // drawfish method 
    public void drawfish(Graphics graphics, int bodyX, int bodyY, int  bodyLength,int bodyHeight,int tailcolor, int bodycolor){ 

     Graphics2D g = (Graphics2D)graphics; 
     bodyX +=x; 
     //colours 
     Color[] colours= new Color[5]; 
     colours[0] = new Color(0, 0, 0);//black 
     colours[1] = new Color(162, 0, 255);//purple 
     colours[2] = Color.red;//red 
     colours[3] = new Color(255,255,0);// yellow 
     colours[4] = new Color(60,179,113);//green 

     //draw fish 
     // body 
     g.setColor(colours[bodycolor]); 
     g.fillOval(bodyX, bodyY, bodyLength, bodyHeight); 
     // tail 
     g.setColor(colours[tailcolor]); 
     int tailWidth = bodyLength/4; 
     int tailHeight = bodyHeight/2; 
     int[] tailPointx = new int[3]; 
     int[] tailPointy = new int[3]; 
     tailPointx[0]=bodyX; 
     tailPointy[0]=bodyY+bodyHeight/2; 
     tailPointx[1]=bodyX-tailWidth; 
     tailPointy[1]=bodyY+bodyHeight/2-tailHeight; 
     tailPointx[2]=bodyX-tailWidth; 
     tailPointy[2]=bodyY+tailHeight+tailHeight; 
     g.fillPolygon(tailPointx, tailPointy, 3); 
     // eye 
     g.setColor(colours[0]); 
     g.fillOval(bodyX+3*bodyLength/4, bodyY+bodyHeight/2-bodyHeight/5,   bodyHeight/5, bodyHeight/5);  
    } 
    }  

Répondre

3

i semble donc que la méthode de drawfish n'est pas appelé.

Eh bien, c'est assez facile à vérifier. Tout ce que vous devez faire est d'ajouter du code de débogage à la méthode pour déterminer si cela est vrai ou non. Ensuite, vous pouvez nous dire si c'est le problème au lieu de deviner.

Autres problèmes:

  1. Ne pas ajouter le MouseListener au composant dans une méthode de peinture. L'écouteur doit être ajouté dans le constructeur de votre classe.

  2. Ne pas ignorer la peinture(). La peinture personnalisée est effectuée en remplaçant la méthode paintComponent(). Et n'oubliez pas d'appeler super.paintComponent (...).

  3. Étendre JPanel au lieu de JComponent. Ensuite, vous pouvez simplement utiliser la méthode setBackground() pour peindre l'arrière-plan.

Cependant, le vrai problème est que lorsque vous cliquez sur la souris les poissons pourraient se laisser entraîner, mais la minuterie ne repeints qui effacera plus tard le panneau 2ms, de sorte que vous ne voyez vraiment le poisson. Débarrassez-vous de la minuterie. Le Minuteur n'a pas besoin de dessiner un poisson.

En supposant que vous voulez peindre plusieurs poissons, vous devez suivre tous les endroits où vous cliquez, puis peindre tous les poissons. Les deux façon de le faire sont:

  1. Gardez un ArrayList des points où vous voulez peindre le poisson et itérer puis à travers cette liste dans votre méthode de peinture
  2. Peindre le poisson sur un BufferedImage lorsque le clic de souris arrive, puis peignez simplement l'image.

Voir Custom Painting Approaches pour des exemples pratiques de ces deux approches.