3

我对 Java 还是很陌生,我有以下问题。正如您在下面看到的,我创建了一个带有图像的 JPanel,每当我单击面板时我想更改该图像,但由于某种原因它不起作用。我已经坐在上面几个小时了,似乎完全被卡住了。如果您能看一下代码并帮助我,我将不胜感激。谢谢你,圣诞快乐。

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,0,0,this);}
    else if(s==false){
      g.drawImage(img2,0,0,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
4

1 回答 1

7

Java始终是按值传递的,因此您的 click 方法不会更改您的类的布尔字段:

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

原因是s上面的参数与类的s字段不同,而是参数做了所谓的“阴影”类字段。一个解决方案是更改此方法并摆脱 s 参数。或者更好——完全摆脱这种方法。

请注意,如果这是我的应用程序,我会使用 JLabel,给它一个 MouseListener,然后在 mousePressed 上简单地交换 ImageIcons。

还有你的布尔切换方法:

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

通过这样做并摆脱错误的 click(...) 方法,可以大大简化和纠正:

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

顺便说一句,if (s == true)这是不必要的多余。如果您需要这样的构造,您可以更简洁明了地执行if (s). 相同的if (s == false)哪个更好地表示为if (!s)

于 2012-12-23T15:47:07.777 回答