测试了下你的代码,的确不能动态修改背景图片,可能原因是你每次都是重新new的JLabel,那么repaint操作已经对于当前新new的JLabel已经无效了。修改意见是只在第一次点击是new JLabel对象,然后其他点击都是setIcon修正JLabel的背景图片就好了。修改你的changePhoto方法如下:
public void changePhoto(String picName) {
System.out.println("change photo :"+picName);
bg = Toolkit.getDefaultToolkit().getImage("demo\\" + picName);
bg2 = bg.getScaledInstance(600, 480, Image.SCALE_DEFAULT);
/*
* JLabel只new一次,保证所有的点击操作使用同一个JLabel,唯一不同的是它的icon
* 动态修改图片,通过修正setIcon完成,它会自动刷新背景的
*/
if(img==null){
img = new JLabel(new ImageIcon(bg2));
img.setOpaque(false);
img.setBounds(0, 0, 600, 480);
p3.add(img, new Integer(-30001));
}else{
img.setIcon(new ImageIcon(bg2));
}
}
测试,OK,能够动态修改背景图片了。setIcon会自动重绘图片的,就不需要调用repaint方法了。