觉悟吧,少年!

——认真编码,认真生活!

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

       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这个父类容器中呢?这点还真没想明白。可能是没有重绘界面,但是重绘的方法都试过了,还是不能动态修改。姑且只找到这种能够实现功能的方法,仅此记录一下。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wojiushiwo945you/article/details/50533448
文章标签: JLabel动态背景设置
个人分类: Java基础
想对作者说点什么? 我来说一句

动态壁纸编辑器

2012年11月17日 882KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭