加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 每次单击时重绘具有不同图像的JPanel

发布时间:2020-12-15 08:48:56 所属栏目:Java 来源:网络整理
导读:我还是 Java的新手,我有以下问题. 正如你在下面看到的那样,我创建了一个带有图像的JPanel,每当我点击面板时我想要更改它,但是由于某种原因它不起作用.我已经坐了几个小时了,似乎完全卡住了.如果你能看一下代码并帮助我,我将非常感激. 谢谢你,祝圣诞快乐. pub
我还是 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,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

解决方法

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();
}

顺便说一句,如果(s == true)不必要地多余.如果你需要这样的结构,你可以更简洁,简单地做if(s).同样适用于if(s == false),更好地表示为(!s)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读