Java图形化界面编程-2-布局管理器

gridx: 用于指定组件在网格中所处的横向索引;



gridy: 用于执行组件在网格中所处的纵向索引;



gridwidth: 用于指定组件横向跨越多少个网格;



gridheight: 用于指定组件纵向跨越多少个网格;

3.调用GridBagLayout对象的setConstraints(Component c,GridBagConstraints gbc )方法,把即将要添加到容器中的组件c和GridBagConstraints对象关联起来;

  1. 把组件添加到容器中;



**案例:**



​ 使用Frame容器,设置GridBagLayout布局管理器,实现下图中的效果:



​ ![在这里插入图片描述](https://img-blog.csdnimg.cn/081fc1e81b2a462399f5cf09a481120a.jpg#pic_center)



**演示代码:**



import java.awt.*;

public class GridBagLayoutDemo {

public static void main(String[] args) {

    //1.创建Frame对象

    Frame frame = new Frame("这里是GridBagLayout测试");



    //2.创建GridBagLayout对象

    GridBagLayout gbl = new GridBagLayout();



    //3.把Frame对象的布局管理器设置为GridBagLayout

    frame.setLayout(gbl);



    //4.创建GridBagConstraints对象

    GridBagConstraints gbc = new GridBagConstraints();



    //5.创建容量为10的Button数组

    Button[] bs = new Button[10];



    //6.遍历数组,初始化每一个Button

    for (int i = 0; i < bs.length; i++) {

        bs[i] = new Button("按钮"+(i+1));

    }



    //7.设置所有的GridBagConstraints对象的fill属性为GridBagConstraints.BOTH,当有空白区域时,组件自动扩大占满空白区域

    gbc.fill=GridBagConstraints.BOTH;



    //8.设置GridBagConstraints对象的weightx设置为1,表示横向扩展比例为1

    gbc.weightx=1;



    //9.往frame中添加数组中的前3个Button

    addComponent(frame,bs[0],gbl,gbc);

    addComponent(frame,bs[1],gbl,gbc);

    addComponent(frame,bs[2],gbl,gbc);



    //10.把GridBagConstraints的gridwidth设置为GridBagConstraints.REMAINDER,则表明当前组件是横向最后一个组件

    gbc.gridwidth=GridBagConstraints.REMAINDER;



    //11.把button数组中第四个按钮添加到frame中

    addComponent(frame,bs[3],gbl,gbc);



    //12.把GridBagConstraints的weighty设置为1,表示纵向扩展比例为1

    gbc.weighty=1;



    //13.把button数组中第5个按钮添加到frame中

    addComponent(frame,bs[4],gbl,gbc);



    //14.把GridBagConstaints的gridheight和gridwidth设置为2,表示纵向和横向会占用两个网格

    gbc.gridheight=2;

    gbc.gridwidth=2;



    //15.把button数组中第6个按钮添加到frame中

    addComponent(frame,bs[5],gbl,gbc);



    //16.把GridBagConstaints的gridheight和gridwidth设置为1,表示纵向会占用1个网格

    gbc.gridwidth=1;

    gbc.gridheight=1;

    //17.把button数组中第7个按钮添加到frame中

    addComponent(frame,bs[6],gbl,gbc);



    //18.把GridBagConstraints的gridwidth设置为GridBagConstraints.REMAINDER,则表明当前组件是横向最后一个组件

    gbc.gridwidth=GridBagConstraints.REMAINDER;



    //19.把button数组中第8个按钮添加到frame中

    addComponent(frame,bs[7],gbl,gbc);



    //20.把GridBagConstaints的gridwidth设置为1,表示纵向会占用1个网格

    gbc.gridwidth=1;



    //21.把button数组中第9、10个按钮添加到frame中

    addComponent(frame,bs[8],gbl,gbc);

    addComponent(frame,bs[9],gbl,gbc);



    //22.设置frame为最佳大小

    frame.pack();



    //23.设置frame可见

    frame.setVisible(true);

}



public static void addComponent(Container container,Component c,GridBagLayout gridBagLayout,GridBagConstraints gridBagConstraints){

    gridBagLayout.setConstraints(c,gridBagConstraints);

    container.add(c);

}

}




### []( )2.4.5 CardLayout



CardLayout 布局管理器以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片(每个卡片其实就是一个组件),每次只有最上面的那个 Component 才可见。就好像一副扑克牌,它们叠在一起,每次只有最上面的一张扑克牌才可见.



| 方法名称 | 方法功能 |

| --- | --- |

| CardLayout() | 创建默认的 CardLayout 布局管理器。 |

| CardLayout(int hgap,int vgap) | 通过指定卡片与容器左右边界的间距 C hgap) 、上下边界 Cvgap) 的间距来创建 CardLayout 布局管理器. |

| first(Container target) | 显示target 容器中的第一张卡片. |

| last(Container target) | 显示target 容器中的最后一张卡片. |

| previous(Container target) | 显示target 容器中的前一张卡片. |

| next(Container target) | 显示target 容器中的后一张卡片. |

| show(Container taget,String name) | 显 示 target 容器中指定名字的卡片. |



**案例:**



​ 使用Frame和Panel以及CardLayout完成下图中的效果,点击底部的按钮,切换卡片



​ ![在这里插入图片描述](https://img-blog.csdnimg.cn/d9c7894d22c849d29cde896191419b37.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAc3RhcnJ56ZmG56a7,size_14,color_FFFFFF,t_70,g_se,x_16#pic_center)



​



**演示代码:**



import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

public class CardLayoutDemo {

public static void main(String[] args) {

    //1.创建Frame对象

    Frame frame = new Frame("这里测试CardLayout");



    //2.创建一个String数组,存储不同卡片的名字

    String[] names = {"第一张","第二张","第三张","第四张","第五张"};



    //3.创建一个Panel容器p1,并设置其布局管理器为CardLayout,用来存放多张卡片

    CardLayout cardLayout = new CardLayout();

    Panel p1 = new Panel();

    p1.setLayout(cardLayout);



    //4.往p1中存储5个Button按钮,名字从String数组中取

    for (int i = 0; i < 5; i++) {

        p1.add(names[i],new Button(names[i]));

    }



    //5.创建一个Panel容器p2,用来存储5个按钮,完成卡片的切换

    Panel p2 = new Panel();



    //6.创建5个按钮,并给按钮设置监听器

    ActionListener listener = new ActionListener() {

        @Override

        public void actionPerformed(ActionEvent e) {

            String command = e.getActionCommand();

            switch (command){

                case "上一张":

                    cardLayout.previous(p1);

                    break;

                case "下一张":

                    cardLayout.next(p1);

                    break;

                case "第一张":

                    cardLayout.first(p1);

                    break;

                case "最后一张":

                    cardLayout.last(p1);

                    break;

                case "第三张":

                    cardLayout.show(p1,"第三张");

                    break;

            }

        }

    };



    Button b1 = new Button("上一张");

    Button b2 = new Button("下一张");

    Button b3 = new Button("第一张");

    Button b4 = new Button("最后一张");

    Button b5 = new Button("第三张");

    b1.addActionListener(listener);

    b2.addActionListener(listener);

    b3.addActionListener(listener);

    b4.addActionListener(listener);

    b5.addActionListener(listener);



    //7.把5个按钮添加到p2中

    p2.add(b1);

    p2.add(b2);

    p2.add(b3);

    p2.add(b4);

    p2.add(b5);



    //8.把p1添加到frame的中间区域

    frame.add(p1);



    //9.把p2添加到frame的底部区域

    frame.add(p2,BorderLayout.SOUTH);



    //10设置frame最佳大小并可见

    frame.pack();

    frame.setVisible(true);

}

}




### []( )2.4.6 BoxLayout



为了简化开发,Swing 引入了 一个新的布局管理器 : BoxLayout 。 BoxLayout 可以在垂直和 水平两个方向上摆放 GUI 组件, BoxLayout 提供了如下一个简单的构造器:



| 方法名称 | 方法功能 |

| --- | --- |

| BoxLayout(Container target, int axis) | 指定创建基于 target 容器的 BoxLayout 布局管理器,该布局管理器里的组件按 axis 方向排列。其中 axis 有 BoxLayout.X\_AXIS( 横向)和 BoxLayout.Y \_AXIS (纵向〉两个方向。 |



**案例1:**



​ 使用Frame和BoxLayout完成下图效果:



![在这里插入图片描述](https://img-blog.csdnimg.cn/67a7635f9095447db18ccf279e315952.jpg#pic_center)



**演示代码1:**



import javax.swing.*;

import java.awt.*;

public class BoxLayoutDemo1 {

public static void main(String[] args) {



    //1.创建Frame对象

    Frame frame = new Frame("这里测试BoxLayout");

    //2.创建BoxLayout布局管理器,并指定容器为上面的frame对象,指定组件排列方向为纵向

    BoxLayout boxLayout = new BoxLayout(frame, BoxLayout.Y_AXIS);

    frame.setLayout(boxLayout);



    //3.往frame对象中添加两个按钮

    frame.add(new Button("按钮1"));

    frame.add(new Button("按钮2"));



    //4.设置frame最佳大小,并可见

    frame.pack();

    frame.setVisible(true);

}

}




在java.swing包中,提供了一个新的容器Box,该容器的默认布局管理器就是BoxLayout,大多数情况下,使用Box容器去容纳多个GUI组件,然后再把Box容器作为一个组件,添加到其他的容器中,从而形成整体窗口布局。



| 方法名称 | 方法功能 |

| --- | --- |

| static Box createHorizontalBox() | 创建一个水平排列组件的 Box 容器 。 |

| static Box createVerticalBox() | 创建一个垂直排列组件的 Box 容器 。 |



**案例2:**



​ 使用Frame和Box,完成下图效果:



​ ![在这里插入图片描述](https://img-blog.csdnimg.cn/2a98fea28f374416a3a6d4672ef3876b.jpg#pic_center)



**演示代码2:**



import javax.swing.*;

import java.awt.*;

public class BoxLayoutDemo2 {

public static void main(String[] args) {



    //1.创建Frame对象

    Frame frame = new Frame("这里测试BoxLayout");



    //2.创建一个横向的Box,并添加两个按钮

    Box hBox = Box.createHorizontalBox();

    hBox.add(new Button("水平按钮一"));

    hBox.add(new Button("水平按钮二"));



    //3.创建一个纵向的Box,并添加两个按钮

    Box vBox = Box.createVerticalBox();

    vBox.add(new Button("垂直按钮一"));

    vBox.add(new Button("垂直按钮二"));



    //4.把box容器添加到frame容器中

    frame.add(hBox,BorderLayout.NORTH);

    frame.add(vBox);



    //5.设置frame最佳大小并可见



    frame.pack();

    frame.setVisible(true);



}

}




通过之前的两个BoxLayout演示,我们会发现,被它管理的容器中的组件之间是没有间隔的,不是特别的美观,但之前学习的几种布局,组件之间都会有一些间距,那使用BoxLayout如何给组件设置间距呢?



其实很简单,我们只需要在原有的组件需要间隔的地方,添加间隔即可,而每个间隔可以是一个组件,只不过该组件没有内容,仅仅起到一种分隔的作用。



![在这里插入图片描述](https://img-blog.csdnimg.cn/37b084d03d4a4422b0f66f34889f42cc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAc3RhcnJ56ZmG56a7,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)



Box类中,提供了5个方便的静态方法来生成这些间隔组件:



| 方法名称 | 方法功能 |

| --- | --- |

| static Component createHorizontalGlue() | 创建一条水平 Glue (可在两个方向上同时拉伸的间距) |

| static Component createVerticalGlue() | 创建一条垂直 Glue (可在两个方向上同时拉伸的间距) |

| static Component createHorizontalStrut(int width) | 创建一条指定宽度(宽度固定了,不能拉伸)的水平Strut (可在垂直方向上拉伸的间距) |

| static Component createVerticalStrut(int height) | 创建一条指定高度(高度固定了,不能拉伸)的垂直Strut (可在水平方向上拉伸的间距) |



**案例3:**



使用Frame和Box,完成下图效果:



![在这里插入图片描述](https://img-blog.csdnimg.cn/a792af9d3e434285b0c51cff3968a4c9.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAc3RhcnJ56ZmG56a7,size_18,color_FFFFFF,t_70,g_se,x_16#pic_center)



**演示代码3:**



import javax.swing.*;

import java.awt.*;

public class BoxLayoutDemo3 {

public static void main(String[] args) {

    //1.创建Frame对象

    Frame frame = new Frame("这里测试BoxLayout");



    //2.创建一个横向的Box,并添加两个按钮

    Box hBox = Box.createHorizontalBox();

    hBox.add(new Button("水平按钮一"));

    hBox.add(Box.createHorizontalGlue());//两个方向都可以拉伸的间隔

    hBox.add(new Button("水平按钮二"));

    hBox.add(Box.createHorizontalStrut(10));//水平间隔固定,垂直间方向可以拉伸

    hBox.add(new Button("水平按钮3"));



    //3.创建一个纵向的Box,并添加两个按钮

    Box vBox = Box.createVerticalBox();

    vBox.add(new Button("垂直按钮一"));

    vBox.add(Box.createVerticalGlue());//两个方向都可以拉伸的间隔

    vBox.add(new Button("垂直按钮二"));

    vBox.add(Box.createVerticalStrut(10));//垂直间隔固定,水平方向可以拉伸

    vBox.add(new Button("垂直按钮三"));



    //4.把box容器添加到frame容器中

    frame.add(hBox, BorderLayout.NORTH);

    frame.add(vBox);



    //5.设置frame最佳大小并可见



    frame.pack();

    frame.setVisible(true);

}

}




 



[



![](https://i-blog.csdnimg.cn/blog_migrate/8e65ad7e26a5f704c31690479643ad3d.jpeg)



开发者涨薪指南 ![](https://img-blog.csdnimg.cn/img_convert/b2f266bc320f4c2ef57a84ea7ba08556.png)



48位大咖的思考法则、工作方式、逻辑体系









# 总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

![](https://img-blog.csdnimg.cn/img_convert/c97509c6b25b87ddba219aceb6606d34.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/6cb8f4a9e163b957cdc0db1eb1669f1c.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/780240cbe3f232e9a672f8ed221bd72d.webp?x-oss-process=image/format,png)

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
frame.setVisible(true);

    }

}



[

开发者涨薪指南 [外链图片转存中…(img-Jb1MZ0Sd-1716216573055)]

48位大咖的思考法则、工作方式、逻辑体系

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

[外链图片转存中…(img-ZWSTbYmL-1716216573056)]

[外链图片转存中…(img-JzHqjLIY-1716216573056)]

[外链图片转存中…(img-USnM8BGh-1716216573056)]

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值