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

原创 2016年01月17日 21:17:24

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

在JLabel上显示图片,并且图片自适应JLabel的大小

在写《Core Java》上的示例代码时,其中有一个FileChooserTest是打开一张图片,并在Label上显示出来,但是这个示例程序有缺点,由于窗口的大小已经固定,而选择打开的图片有大有小,如...
  • u010889616
  • u010889616
  • 2016年03月31日 21:34
  • 5533

java中JLabel设置背景图片

先贴代码,再看注释;//显示图片的JLabel ImageIcon background =new ImageIcon(test.class.getResource("jpanel...
  • jjarchu
  • jjarchu
  • 2016年05月16日 11:42
  • 2813

为jlabel设置背景颜色

jlabel默认是透明的,所以默认情况下对其设置背景色是不管用的。 但是这样就可以更改其背景颜色: jlabel.setOpaque(true); jlabel.setbackground(co...
  • Mr_Pang
  • Mr_Pang
  • 2015年08月12日 19:35
  • 3101

JAVA之设置背景图片的几种方法

 第一种方法,通过JLabel来装载图片。 创建一个ImageIcon对象,来获取背景图片。 ImageIcon img = new ImageIcon("image/img1.png");...
  • huai814586181
  • huai814586181
  • 2015年05月17日 13:28
  • 15969

swing jlabel 加背景图片 做出frame添加背景图片效果

//原理很简单,大家知道早Jlabel很容易添加背景图片,这个例子就是把一个JLabel放到一个Frame里,把它铺满,再加上图片,然后所有的组件都加到这个JLabel上,就回出现给Frame加上了背...
  • lushuaiyin
  • lushuaiyin
  • 2011年09月30日 15:49
  • 3280

修改JLabel背景色

如何修改JLabel背景色?搞笑...... JLabel label = new JLabel(); label.setBackground(Color.RED); it does n...
  • Dancen
  • Dancen
  • 2013年06月15日 11:05
  • 2885

如何为JLabel添加背景色和设置其imageicon的位置和大小

nickname = new JLabel[50]; ImageIcon icon=new ImageIcon("image/head.jpg"); //设置icon的大小 icon.se...
  • su20145104009
  • su20145104009
  • 2016年10月20日 19:14
  • 4071

JLabel控件使用方法

JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐。默认情况下,标签在其显示区内垂直居中对齐。默认情况下,只显示文本的标签是开始边对...
  • liangzhiqiangshizhu
  • liangzhiqiangshizhu
  • 2011年04月16日 13:47
  • 9938

【swing】JLabel详解以及使用示例

JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐。默认情况下,标签在其显示区内垂直居中对齐。默认情况下,只显示文本的标签是开始边对...
  • lzm18064126848
  • lzm18064126848
  • 2015年08月28日 10:35
  • 11564

JLabel基本用法

import java.awt.FlowLayout; import javax.swing.Icon; import javax.swing.ImageIcon; import javax...
  • youyigong
  • youyigong
  • 2011年10月02日 12:18
  • 23710
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单东西-java动态更改JLabel背景图片
举报原因:
原因补充:

(最多只允许输入30个字)