钻研了一下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);
}
}