java背景图片

本文介绍如何在Java中设置背景图片并实现透明效果。关键在于使用setBackground(new Color(255, 0, 0, 0))设置透明颜色,并在重载的paint方法中使用g.drawImage绘制图片。然而,这种方法存在初次显示不完整的问题,通过创建Redraw类进行定时重画以解决。尽管如此,仍然会出现图片加载不连续的情况。为改善用户体验,建议在加载后台资源的同时完成GUI组件的初始化,延迟设置组件的可见性。" 124514383,9575442,STM32HAL库配置及SPI通信实战,"['STM32', '单片机', 'SPI通信', '存储器', '嵌入式开发']
最近一个月全力做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程序中背景图片大小的方法 在Java中,可以通过多种方式来调整背景图片的大小。以下是几种常见的方法: #### 方法一:使用 `Graphics` 和 `drawImage()` 进行缩放 通过 `Graphics.drawImage()` 方法可以实现单次调用来完成图片的缩放操作[^2]。此方法允许指定目标区域的宽度和高度。 ```java import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; public class ImageScaler { public static void scaleImage(Graphics g, String imagePath, int width, int height) { ImageIcon icon = new ImageIcon(imagePath); Image img = icon.getImage(); if (g != null && img != null) { g.drawImage(img, 0, 0, width, height, null); // 缩放到指定宽高并绘制到画布上 } } } ``` 上述代码片段展示了如何利用 `drawImage()` 将一张图片按照给定的目标尺寸进行缩放。 --- #### 方法二:创建缩略图并通过缓冲区存储 如果需要更灵活的方式处理图片,则可采用自定义函数生成缩略图,并将其保存至内存中的 `BufferedImage` 对象中[^3]。 ```java import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; public class ThumbnailCreator { private static BufferedImage makeThumbnail(Image img, int width, int height) throws IOException { BufferedImage thumbnail = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics graphics = thumbnail.createGraphics(); if (graphics != null && img != null) { graphics.drawImage(img, 0, 0, width, height, null); // 绘制缩放后的图像 graphics.dispose(); // 关闭绘图资源释放内存 } return thumbnail; } public static void main(String[] args) throws IOException { // 假设已加载原始图片对象 'img' BufferedImage resultImg = makeThumbnail(img, desiredWidth, desiredHeight); } } ``` 这种方法能够精确控制输出质量以及最终文件格式。 --- #### 方法三:借助第三方库 OpenCV 实现复杂变换 对于更加复杂的场景需求(如保持比例不变的情况下自动计算最佳适配参数),还可以引入计算机视觉领域常用的开源工具包——OpenCV 来辅助开发[^5]。下面是一个简单的例子说明如何基于它来进行基本的比例调整功能实现: ```cpp // 注意这里是 C++ 风格伪代码演示逻辑流程而非实际可用 JAVA 版本 API 调用形式 Mat src = imread("input.jpg"); resize(src, dst, Size(new_width, new_height)); imwrite("output_resized.jpg",dst); ``` 虽然这里展示的是C++风格API示意,但在JAVA环境下同样存在对应封装好的类可供选用。 --- ### 总结 以上介绍了三种不同的技术手段用于解决同一问题即改变背景图案的实际显示面积范围。具体选择哪一种取决于项目实际情况和个人偏好等因素考虑之后再做决定即可满足不同层次的需求[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值