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 は常に値渡しであるため、クリック メソッドはクラスのブール フィールドを変更しません。

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 に答える