java背景图片

本文介绍如何在Java中设置背景图片并实现透明效果。关键在于使用setBackground(new Color(255, 0, 0, 0))设置透明颜色,并在重载的paint方法中使用g.drawImage绘制图片。然而,这种方法存在初次显示不完整的问题,通过创建Redraw类进行定时重画以解决。尽管如此,仍然会出现图片加载不连续的情况。为改善用户体验,建议在加载后台资源的同时完成GUI组件的初始化,延迟设置组件的可见性。" 124514383,9575442,STM32HAL库配置及SPI通信实战,"['STM32', '单片机', 'SPI通信', '存储器', '嵌入式开发']
摘要由CSDN通过智能技术生成
最近一个月全力做JAVA的课程设计,图形界面全是由本人来做,因此即使知道会java图形界面也没啥个用,不过还是得想方设法地学会去用。
由于本人最会的就是装B,在课程设计中不仅弄了N个动画,还有自定义的按钮,图片按钮等一堆与真实功能没啥个联系的东东。
其中本人还花了n天去做java皮肤,以及网页主题。这里网页主题是啥个回事由于没啥关系所以不扯了。
主要说一下Java皮肤,我所说的java皮肤即是颜色与图片,比如菜单或工具栏的背景,选了颜色的变颜色,选了图片的就图片背景。
颜色的容易,直接setBackground(color)就KO了,但是图片背景怎么个弄呢,其实是十分简单的。

下面是一些代码

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;

public class Main extends JFrame{

	public Main(){
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500,400);
		setVisible(true);
		add(new Menu(),BorderLayout.NORTH);	//菜单
		add(new Panel(),BorderLayout.CENTER);	//内容
	}
	
	private class Panel extends JPanel{
		public Panel(){
			setPreferredSize(new Dimension(500,380));
		}
	}
	
	private class Menu extends JMenuBar{
		public Menu(){
			JMenu m1=new JMenu("a");
			JMenu m2=new JMenu("b");
			add(m1);
			add(m2);
		}
		
	}
	public static void main(String[] args){
		new Main();
	}
}
上面没啥个意思,下面图

再下面是加了背景后的代码


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;


public class Main extends JFrame{
	private JMenuBar jm=new Menu();
	private JPanel jp=new Panel();
	
	public Main(){
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500,400);
		new Redraw().start();
		add(jm,BorderLayout.NORTH);
		add(jp,BorderLayout.CENTER);
		setVisible(true);
	}
	
	private class Redraw extends Thread{
		@Override
		public void run(){
			long l1=System.currentTimeMillis();
			long l2;
			while(true){
				jm.repaint();
				jp.repaint();
				l2=System.currentTimeMillis();
				if(l2-l1>=1000){
					break;
				}
			}
		}
	}
	
	private class Panel extends JPanel{
		private Image i=Toolkit.getDefaultToolkit().getImage("Image\\bg.png");
		public Panel(){
			setBackground(new Color(255,0,0,0));
			setPreferredSize(new Dimension(500,370));
		}
		@Override
		public void paint(Graphics g){
			g.drawImage(i,0,0,500,370,null);
			super.paint(g);
		}
	}
	
	private class Menu extends JMenuBar{
		private Image i=Toolkit.getDefaultToolkit().getImage("Image\\tool.png");
		public Menu(){
			setBackground(new Color(255,0,0,0));
			JMenu m1=new JMenu("a");
			JMenu m2=new JMenu("b");
			add(m1);
			add(m2);
		}
		@Override
		public void paint(Graphics g){
			g.drawImage(i,0,0,500,30,null);
			super.paint(g);
		}
	}
	
	public static void main(String[] args){
		new Main();
	}
}

加了两张图片

现在来说说原理,其实主要是setBackground(new Color(255,0,0,0))这句起了效果。

这是设置透明颜色的。

然后重载paint方法,在super.paint(g)之前用g.drawImage把图片画出来了。

因为设置的是透明色,所以super.paint(g)画背景时画上透明色,即是不会覆盖你之前画的背景图片。

不过此法有很多弊端

一是如果直接那样做的话第一次paint时图片不会显示出来,第二次才会出来。

即是启动了,没图片,你放大一下软件,然后软件重画,这时才显示出来。

由于我想不到有什么法子,所以只好设置一个线程让它启动后的一秒内不断重画。

于是有了上面那个Redraw类

但是这还是有弊端的。

启动后会发现上面图片先在中上位置显示出来,然后再在最上面出现,最后中间的图片才慢慢地出现。

原因很简单,添加menu,然后画在中上位置,添加panel后,menu移到最上面

所以,图片显示不连续,这样的话体验感十分差,怎么办。

本人的软件是做了个像eclipse的进度条,反正是要加载后台资源的。

于是在加载资源时顺便把GUI的各个部件给处理完,然后才总体的setVisible(true)。

由于有一点时间差(要加载的资源太多了),所以本人软件显示出来时所有的图片都马上出来了。

Java中设置背景图片可以使用JPanel和JLabel组件。具体步骤如下: 1. 导入所需的类库: ``` import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JPanel; ``` 2. 创建一个JPanel组件并设置其布局方式为null: ``` JPanel panel = new JPanel(null); ``` 3. 加载图片并创建一个ImageIcon对象: ``` ImageIcon imageIcon = new ImageIcon("imagePath"); ``` 4. 创建一个JLabel组件并将ImageIcon对象添加到该组件中: ``` JLabel label = new JLabel(imageIcon); ``` 5. 设置JLabel组件的大小和位置: ``` label.setBounds(0, 0, imageIcon.getIconWidth(), imageIcon.getIconHeight()); ``` 6. 将JLabel组件添加到JPanel中: ``` panel.add(label); ``` 7. 重写JPanel组件的paintComponent方法,在该方法中绘制背景图片: ``` @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Image image = imageIcon.getImage(); g.drawImage(image, 0, 0, this); } ``` 完整代码示例: ``` import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class BackgroundPanel extends JPanel { private ImageIcon imageIcon; public BackgroundPanel() { super(null); imageIcon = new ImageIcon("imagePath"); JLabel label = new JLabel(imageIcon); label.setBounds(0, 0, imageIcon.getIconWidth(), imageIcon.getIconHeight()); add(label); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Image image = imageIcon.getImage(); g.drawImage(image, 0, 0, this); } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setContentPane(new BackgroundPanel()); frame.setVisible(true); } } ``` 其中,"imagePath"为背景图片的路径,可以根据实际情况修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值