jframe里的面板结构

本文介绍了JFrame的内部结构,特别是JLayeredPane的使用,详细阐述了如何通过设置组件的层级来实现复杂的布局和覆盖效果。内容包括JFrame的contentPane面板的add顺序对覆盖的影响,以及如何利用layered面板的深度设置函数来更灵活地控制组件的显示。同时,提供了一个实例代码,展示了如何创建两个绘制图片的面板,并通过设置LayeredPane的层级来调整它们的覆盖关系。
摘要由CSDN通过智能技术生成

 钻研了一下JFrame的内部结构,几篇博客非常有用。

https://blog.csdn.net/baidu_36412742/article/details/79791613

 https://blog.csdn.net/weixin_43670802/article/details/90487386

 

总而言之,就是JFrame内部就有可供操控的面板,合理使用可以做出我们想要的效果。

通常而言,在为了解JFrame内部结构之前,我们都是直接将我们创建好的组件——面板或者其他组件直接add到Frame中。

这样的方法add进入的都是contentPane面板中,而contentpane面板讲究add的顺序,先add的面板或者组件会被后add的所覆盖。并且如果不调用content面板的setOpaque()函数,值设为false,让面板中没填充部分变为透明的话,默认填充将会填充白色,从而充满整个加入到content面板中的面板,导致覆盖现象更加的严重

 

 我们可以选择不使用默认的add加入到content面板中,而是直接将面板插入到了layered面板中也是一种不错的选择,相比于用代码的顺序来控制覆盖与否,显然使用layered面板中的深度设置函数更加灵活,值得一提的是,content面板本身也是在layered面板中的,因此也可被深度设置函数设置深度,将其设到顶层或者是默认情况下的底层(此处还是由于add的先后性质影响,因为content面板是在jfram窗口创建的时候就已经一起生成的面板,是绝对要比我们后面生成再加入的面板要早add到layered面板中的,自然会是在最底层)

当然,如果将content面板设置为了顶层,又想要显示在其后面的其他面板,自然要将content面板的透明给设置起来。(opaque意为不透明的)

下面写了一个小小的案例,设置了两个重写了paint方法从而能绘制指定图片的面板,分别加入到了layered面板和content面板中,通过调用layered面板中的setLayer函数,设置好了对应面板的深度,大家可以试试自己调整数据看看能不能达到覆盖的实行。

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class jframetext {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrame aFrame=new JFrame();
		aFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		aFrame.setBounds(200, 100, 1000, 800);
		aFrame.setLayout(null);
	
		JLayeredPane aJLayeredPane=aFrame.getLayeredPane();
		JComponent aComponent=(JComponent) aFrame.getContentPane();
		
		
		File imagelay=new File(/*“图片路径”*/);
		imageJPanel backimagelay=new imageJPanel(imagelay);//图片面板1
		backimagelay.setBounds(0, 0, 300, 400);//设置大小
		
		File image2=new File(/*“图片路径”*/);
		imageJPanel backimagecont=new imageJPanel(image2);//图片面板2
		backimagecont.setBounds(0, 0, 400,200);//设置大小
		
		
		aJLayeredPane.add(backimagelay);
		
		aComponent.add(backimagecont);
		
		aJLayeredPane.setLayer(backimagelay,-1);//-1为底层lay
		aJLayeredPane.setLayer(aComponent, 0);//0为顶层cont
		
		aComponent.setOpaque(false);//设置面板为不填充部分是透明的
		
		aFrame.setVisible(true);
	}

}
class imageJPanel extends JPanel{//图片类
	Image imageFile;
	
	public imageJPanel(File a) {
		// TODO Auto-generated constructor stub
		try {
			imageFile=ImageIO.read(a);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Override
	public void paint(Graphics arg0) {
		// TODO Auto-generated method stub
		super.paint(arg0);
		arg0.drawImage(imageFile, 0, 0,this);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值