您的位置:首页 > 编程语言 > Java开发

简单东西-java动态更改JLabel背景图片

2016-01-17 21:17 344 查看
       java的awt设置背景图片的一种方式是使用JLabel类,它的setIcon可以设置背景图片,但是如何动态修改背景图片呢?这源于问答频道上的一个问题,题主给的代码总是无法正确动态修改背景图片,找了一阵子,发现它处理点击事件的代码存在错误,JLabel类对象实例化一次就够了,然后动态setIcon修改背景。而不是在点击时重新实例化标签对象。

public class DynamicBackground extends JFrame implements ActionListener {
JMenuBar bar;
JMenu menus;
JMenuItem[] items;
String[] picName = { "琴声悠扬", "绿色草地", "卢浮宫殿" };
String[] picName2 = { "picture1.jpg", "picture2.jpg", "picture3.jpg" };
JComponent p3;
JLabel imgLabel;
Image bg, bg2;

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

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(imgLabel==null){
imgLabel = new JLabel(new ImageIcon(bg2));
imgLabel.setOpaque(false);
imgLabel.setBounds(0, 0, 600, 480);
p3.add(imgLabel, new Integer(-30001));
}else{
imgLabel.setIcon(new ImageIcon(bg2));
}
}

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中没有imgLbel==null的判断,就是直突突地new操作如下:

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);
imgLabel = new JLabel(new ImageIcon(bg2));
imgLabel.setOpaque(false);
imgLabel.setBounds(0, 0, 600, 480);
p3.add(imgLabel, new Integer(-30001));
imgLabel.repaint();
}       这样每次都new一个JLabel为什么不能达到动态修改的效果呢?先前new的JLabel对象是否还存在于p3这个父类容器中呢?这点还真没想明白。可能是没有重绘界面,但是重绘的方法都试过了,还是不能动态修改。姑且只找到这种能够实现功能的方法,仅此记录一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息