程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> java swing-關於java添加背景圖片的問題

java swing-關於java添加背景圖片的問題

編輯:編程綜合問答
關於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()也沒有用,求大神指點,怎樣才能實現這樣連續換背景

最佳回答:


測試了下你的代碼,的確不能動態修改背景圖片,可能原因是你每次都是重新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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved