ChingsChen 2016-01-17 01:54 采纳率: 26.7%
浏览 2035
已采纳

关于java添加背景图片的问题

自己写了一个更换背景的程序,代码如下:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class BackgroundTest extends JFrame implements ActionListener{
JMenuBar bar;
JMenu menus;
JMenuItem[]items;
String []picName={"琴声悠扬","绿色草地","卢浮宫殿"};
String []picName2={"picture2.jpg","picture9.jpg","picture8.jpg"};
JComponent p3;
JLabel img;
Image bg,bg2;
public BackgroundTest(){
bar=new JMenuBar();
menus=new JMenu("更换背景");
items=new JMenuItem[3];
bar.add(menus);
for(int i=0;i<3;i++){
items[i]=new JMenuItem(picName[i]);
menus.add(items[i]);
items[i].addActionListener(this);
}
this.setJMenuBar(bar);
//this.changePhoto("picture2.jpg");
p3=(JComponent)getLayeredPane();
p3.setLayout(null);
((JComponent) getContentPane()).setOpaque(false);;
this.setUndecorated(false);
this.setResizable(false);
JTextArea input=new JTextArea();
input.setOpaque(false);
input.setFont(new Font("茶语GBK",Font.PLAIN,20));
input.setForeground(Color.GREEN);
add(input);
setTitle("BackgroundTest");
setSize(600,480);
setVisible(true);
}
public static void main(String[] args) {
new BackgroundTest();
}
public void changePhoto(String picName){

    bg=Toolkit.getDefaultToolkit().getImage("demo\\"+picName);
    bg2=bg.getScaledInstance(600,480, Image.SCALE_DEFAULT);
    img=new JLabel(new ImageIcon(bg2));
    img.setBounds(0,0,600,480);
    p3.add(img,new Integer(-30001));;
    img.repaint();
}
public void actionPerformed(ActionEvent e){
    if(e.getSource()==items[0])
        this.changePhoto(picName2[0]);
    else if(e.getSource()==items[1])
        this.changePhoto(picName2[1]);
    else
        this.changePhoto(picName2[2]);
}

}
运行程序第一次选择选项可以更换,第二次就不能更换了,为什么会这样,在changePhoto()最后一行调用img.repaint()也没有用,求大神指点,怎样才能实现这样连续换背景

  • 写回答

2条回答

  • 毕小宝 博客专家认证 2016-01-17 11:34
    关注

    测试了下你的代码,的确不能动态修改背景图片,可能原因是你每次都是重新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方法了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名