Java – redraws jpanels with different images each time you click

I'm still a novice in Java. I have the following questions

public class Level {
  JPanel panel
  String img1Path = "img1.png";
  String img2Path = "img2.png";
  Image img1 = Toolkit.getDefaultToolkit().getImage(img1Path);
  Image img2 = Toolkit.getDefaultToolkit().getImage(img2Path);
  boolean s1 = false;

  public Level(){
    initGUI();
  }

  public void initGUI(){
    panel = new JPanel(){
      public void paintComponent(Graphics g){
       super.paintComponent(g);
       draw(g,s1);
      }
    }
   panel.addMouseListener(new ImgListener(s1));
  }

  public void draw(Graphics g,boolean s){
    if(s==true){
      g.drawImage(img1,this);}
    else if(s==false){
      g.drawImage(img2,this);}
    }//draw()

  public void click(boolean s,boolean b){
    s = b;
    repaint();
  }

  public class ImgListener extends MouseAdapter {
    boolean s;

    public ImgListener(boolean s){
      pS(s);
    }

    public void mouseClicked(MouseEvent e){
      if(s==true){
        click(s,false);
      }
      else if(s==false){
        click(s,true);
      }
   }//mouseClicked

  public void pS(boolean s){
    this.s = s;
   }//pS

  }//ImgListener

}//Level

Solution

Java is always passed by value, so your click method does not change the Boolean field of the class:

public void click(boolean s,boolean b){
  s = b;  // this does not change the class field s.
  repaint();
}

The reason is that the S parameter above is different from the s field of the class, but the parameter implements the so-called "shadow" class field The solution is to change this method and delete the S parameter Or better - get rid of it completely

Note that if this is my application, I will use jlabel, give it a mouselistener, and simply swap imageicons on mousePressed

Your Boolean switching method:

public void mouseClicked(MouseEvent e){
  if(s==true){
    click(s,false); 
  }
  else if(s==false){
    click(s,true);
  }
}

By doing so and getting rid of the wrong click (...) method, you can greatly simplify and correct:

public void mouseClicked(MouseEvent e){
  s = !s;
  repaint();
}

By the way, if (s = = true) is unnecessarily redundant If you need such a structure, you can do if (s) more concisely and simply The same applies to if (s = = false), better expressed as (! S)

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>