Swing带背景的窗体

实现思路

Swing中给窗体设置背景大概有如下两种思路:
1、绝对布局或其他少数可以进行组件覆盖叠加的布局下,使用JLabel作为窗体的最底层,给其设置背景图;
2、定义一个JPanel的子类,重写其paintComponent方法,其中进行背景图的绘制。

资源准备

创建Java项目,其中创建一个“Source Folder”,并创建一个包“images”用来存放图片资源:
在这里插入图片描述
在这里插入图片描述

使用JLabel实现

通过插件WindowBuilder,创建一个JFrame,并设置其contentPane为绝对布局,然后在其上放置组件等,最后放置JLabel并置于底层(在结构树中最下的位置):

然后设置lblBg的背景图:

关于背景拉伸

如果要实现背景图的自动拉伸,可以定义ImageIcon的子类,重写其paintIcon方法,使其根据JLabel大小自动缩放。网上代码很多,此处不详细展开。
另外,若使用了绝对布局,若要想实现背景随窗口变化而自动拉伸,一般可以通过监听窗口的尺寸改变事件,当窗口尺寸改变时,同时修改JLabel尺寸。

使用JPanel子类实现(推荐)

定义一个JPanel的子类,并重写其paintComponent方法。
注意,重写这个方法有两种流行套路,其中一种是使用Graphics2D类的scale缩放,而这种缩放会影响该JPanel上的其他组件,会连带进行缩放,不推荐使用;另一种套路则是直接绘制当前背景图,使用drawImage方法进行缩放控制,代码如下:

public class BgPanel extends JPanel {
	
	private ImageIcon imageIcon = null;

	/**
	 * Create the panel.
	 */
	public BgPanel(URL imgUrl) {
		super();
		imageIcon = new ImageIcon(imgUrl);
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (imageIcon != null) {
			g.drawImage(imageIcon.getImage(), 0, 0, getWidth(), getHeight(), 0, 0, imageIcon.getIconWidth(), imageIcon.getIconHeight(), null);
		}
	}
}

之后,再替换JFrame中的构造背景面板的代码:

	public MainFrm2() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 487, 336);
		//contentPane = new JPanel(); 替换掉这里的构造
		contentPane = new BgPanel(MainFrm2.class.getResource("/images/bg.jpg"));
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		// ...
	}

这种方式干净简洁,推荐使用。实现效果:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Java Swing中为窗体添加背景图片,可以按照以下步骤进行操作: 1. 创建一个继承自JFrame的自定义窗体类。 2. 在该类的构造函数中设置窗体的标题、大小和关闭操作。 3. 创建一个继承自JPanel的自定义面板类,并重写其paintComponent方法来绘制背景图片。 4. 在自定义窗体类的构造函数中创建背景面板对象,并将其设置窗体的内容面板。 下面是一个示例代码: ```java import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; public class BackgroundFrame extends JFrame { public BackgroundFrame() { setTitle("Background Image Demo"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); BackgroundPanel backgroundPanel = new BackgroundPanel(); setContentPane(backgroundPanel); pack(); setLocationRelativeTo(null); // 居中显示窗口 } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { BackgroundFrame frame = new BackgroundFrame(); frame.setVisible(true); }); } private static class BackgroundPanel extends JPanel { private Image backgroundImage; public BackgroundPanel() { backgroundImage = new ImageIcon("path/to/your/image.jpg").getImage(); Dimension dimension = new Dimension(backgroundImage.getWidth(null), backgroundImage.getHeight(null)); setPreferredSize(dimension); } @Override protected void paintComponent(Graphics graphics) { super.paintComponent(graphics); graphics.drawImage(backgroundImage, 0, 0, null); } } } ``` 在上述代码中,将`path/to/your/image.jpg`替换为你自己的背景图片路径。然后运行`BackgroundFrame`类,就会显示背景图片窗体。 希望这对你有所帮助!如果还有其他问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值