Java图形用户界面设计的布局管理器

LayoutManager布局管理器

  • 前言
  • 一、布局管理器的背景
    • 简介
  • 二、FlowLayout
    • 构造方法
    • 参数说明
    • 代码演示
      • AWT
      • Swing
  • 三、BorderLayout
    • 布局管理器
    • 注意点
    • 构造方法
    • 代码演示
      • AWT
        • 示例一
        • 示例二
      • Swing
  • 四、GridLayout
    • 简介
    • 构造方法
    • 代码示例
      • AWT
      • Swing
  • 五、GridBagLayout
    • GridBagConstraints API
    • GridBagLayout使用步骤
    • 代码示例
      • AWT
      • Swing
  • 六、CardLayout
    • 简介
    • 方法名称
    • 代码示例
      • AWT
      • Swing
  • 七、BoxLayout
    • 简介
    • 方法名称1
      • 代码示例1
    • 方法名称2
      • 代码示例2
    • 设置间隔
    • 代码示例


前言

推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。
https://www.captainbed.cn/f1

LayoutManager布局管理器是用于管理和控制视图组件在界面上的布局和排列方式的重要组件。


一、布局管理器的背景

Component中有一个方法 setBounds() 可以设置当前容器的位置和大小,但是我们需要明确一件事,如果我们手动的为组件设置位置和大小的话,就会造成程序的不通用性,例如:

Label label = new Label("你好,世界");

创建了一个lable组件,很多情况下,我们需要让lable组件的宽高和“你好,世界”这个字符串自身的宽高一致,这种大小称为最佳大小。由于操作系统存在差异,例如在windows上,我们要达到这样的效果,需要把该Lable组件的宽和高分别设置为100px,20px,但是在Linux操作系统上,可能需要把Lable组件的宽和高分别设置为120px,24px,才能达到同样的效果。

如果要让我么的程序在不同的操作系统下,都有相同的使用体验,那么手动设置组件的位置和大小,无疑是一种灾难,因为有太多的组件,需要分别设置不同操作系统下的大小和位置。为了解决这个问题,Java提供了LayoutManager布局管理器,可以根据运行平台来自动调整组件大小,程序员不用再手动设置组件的大小和位置了,只需要为容器选择合适的布局管理器即可。

在这里插入图片描述

简介

布局是指 GUI 程序容器中各个组件的排列顺序、彼此之间的位置关系、组件大小,以及当容器移动或调整大小后组件的变化。Java 语言具有跨平合特性,所以不像其他程

序语言那样直接使用位置坐标来布局组件的位置和大小。为了满足跨平台的特性,Java 语言提供了布局管理器来管理组件在容器中的布局,使得相同的Java GUI 外观界面在不同的平台上都能调整到最佳样式。

Java 的布局管理器是以接口和类的形式提供的,其中 AWT 的布局管理器都包含在java.awt 包中。该包中的接口 LayoutManager 提供了基本布局管理操作的抽象方法,所有布局管理器类都直接或间接实现了该接口。在接口 LayoutManager2中,新增了可以精准控制组件布局的抽象方法,部分布局管理器类实现了该接口。AWT 提供了多种布局管理器类,不同的布局管理器类在布局策略和算法上也不同,常用的有 FlowLayout、BorderLayout、GridLayout 和 CardLayout。

Swing 除了使用 AWT的布局管理器接口和类以外,新增加了 BoxLayout. BoxLayout 按照主轴方向以居中对齐的方式顺序加入组件。BoxLayout的主轴方向默认为纵向,即自上而下;也可以自定义主轴方向为横向,即从左至右。

Java 语言中,容器都指定有默认的布局管理器;但是,容器对象可以调用成员方法setLayout()改变布局管理,也可调用成员方法 getLayout()获取当前的布局管理。

二、FlowLayout

在 FlowLayout 布局管理器 中,组件像水流一样向某方向流动 (排列) ,遇到障碍(边界)就折回,重头开始排列 。在默认情况下, FlowLayout 布局管理器从左向右排列所有组件,遇到边界就会折回下一行重新开始。

构造方法

构造方法方法功能
FlowLayout()使用默认 的对齐方式及默认的垂直间距、水平间距创建 FlowLayout 布局管理器。
FlowLayout(int align)使用指定的对齐方式及默认的垂直间距、水平间距创建 FlowLayout 布局管理器。
FlowLayout(int align,int hgap,int vgap)使用指定的对齐方式及指定的垂直问距、水平间距创建FlowLayout 布局管理器。

参数说明

FlowLayout 中组件的排列方向(从左向右、从右向左、从中间向两边等) , 该参数应该使用FlowLayout类的静态常量 : FlowLayout. LEFTFlowLayout. CENTERFlowLayout. RIGHT ,默认是左对齐。

FlowLayout 中组件中间距通过整数设置,单位是像素,默认是5个像素。

代码演示

AWT

import java.awt.*;
public class test
{public static void main(String []args){//创建FrameFrame frame = new Frame("test:FlowLayout");//修改Frame容器的布局方式为FlowLayoutframe.setLayout(new FlowLayout(FlowLayout.LEFT,20,20));//往Frame中添加100个buttonfor (int i = 0; i < 100; i++) {frame.add(new Button(("button" + i)));}//设置Framed的最佳大小frame.pack();//设置frame可见frame.setVisible(true);}
}

这段代码是一个使用FlowLayout布局方式的Java GUI程序。

首先,通过导入java.awt.*包来引入必要的图形库。

然后,定义了一个名为test的公共类,并在其中定义了一个名为main的静态方法。

main方法中,首先创建了一个名为frameFrame对象,并设置它的标题为"test:FlowLayout"。

接着,将Frame容器的布局方式修改为FlowLayout,并指定了左对齐方式以及水平和垂直间距为20。

然后,使用循环语句向Frame中添加了100个Button组件,命名为"button0"、“button1”、…、“button99”。

接下来,通过调用frame.pack()方法来设置Frame的最佳大小,以适应所有组件的大小。

最后,设置Frame可见,以显示GUI界面。

总结来说,这段代码实现了一个使用FlowLayout布局的Frame窗口,并向其中添加了100个Button组件。
在这里插入图片描述

Swing

JPanel默认布局为FlowLayout

下面是一个使用Swing的FlowLayout布局的示例程序:

import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.FlowLayout;public class FlowLayoutExample {public static void main(String[] args) {// 创建一个 JFrame 对象JFrame frame = new JFrame("FlowLayout Example");// 设置窗口的大小frame.setSize(300, 200);// 设置窗口的布局管理器为 FlowLayoutframe.setLayout(new FlowLayout());// 创建一些按钮并添加到窗口中JButton button1 = new JButton("Button 1");frame.add(button1);JButton button2 = new JButton("Button 2");frame.add(button2);JButton button3 = new JButton("Button 3");frame.add(button3);JButton button4 = new JButton("Button 4");frame.add(button4);// 设置窗口可见frame.setVisible(true);}
}

在这个示例中,我们首先创建了一个 JFrame 对象,并设置了窗口的大小。然后,我们将窗口的布局管理器设置为 FlowLayout。接下来,我们创建了四个按钮,并使用 frame.add() 方法将它们添加到窗口中。最后,我们将窗口设置为可见。运行程序后,你将看到四个按钮按照 FlowLayout 的规则依次排列在窗口中。

三、BorderLayout

布局管理器

BorderLayout 将容器分为 EASTSOUTHWESTNORTHCENTER五个区域,普通组件可以被放置在这 5 个区域的任意一个中 。

BorderLayout布局 管理器的布局示意图如图所示 。

在这里插入图片描述
当改变使用 BorderLayout 的容器大小时, NORTHSOUTHCENTER区域水平调整,而 EASTWESTCENTER 区域垂直调整。

注意点

使用BorderLayout 有如下两个注意点:

  1. 当向使用 BorderLayout 布局管理器的容器中添加组件时 , 需要指定要添加到哪个区域中 。 如果没有指定添加到哪个区域中,则默认添加到中间区域中;
  2. 如果向同一个区域中添加多个组件时 , 后放入的组件会覆盖先放入的组件;

构造方法

构造方法方法功能
BorderLayout()使用默认的水平间距、垂直 间距创建 BorderLayout 布局管理器 。
BorderLayout(int hgap,int vgap):使用指定的水平间距、垂直间距创建 BorderLayout 布局管理器。

代码演示

AWT

示例一
import java.awt.*;
public class test
{public static void main(String []args){//创建Frame对象Frame frame = new Frame("test:BorderLayout");//设定Frame的布局管理器为BorderLayoutframe.setLayout(new BorderLayout(30,30));frame.add(new Button("East"), BorderLayout.EAST);frame.add(new Button("West"), BorderLayout.WEST);frame.add(new Button("Center"),BorderLayout.CENTER);frame.add(new Button("South"),BorderLayout.SOUTH);//设置Frame为最佳大小frame.pack();frame.setVisible(true);}
}

这是一个使用Java编写的简单程序,主要目的是演示使用BorderLayout布局管理器创建界面。

  1. 首先导入java.awt包,这是Java的标准图形界面库。
  2. 创建一个名为"test"的public类。
  3. main函数中创建一个Frame对象,参数为窗口的标题。
  4. 使用setLayout方法将窗口的布局管理器设置为BorderLayout,参数为水平和垂直间距。
  5. 使用add方法向窗口中添加按钮,使用BorderLayout的常量作为位置参数。
  6. 使用pack方法设置窗口的大小为最佳大小。
  7. 使用setVisible方法将窗口设为可见状态。

总结起来,该程序通过BorderLayout布局管理器将按钮添加到窗口的不同位置,实现了简单的界面布局。
在这里插入图片描述

如果不往某个区域中放入组件,那么该区域不会空白出来,而是会被其他区域占用

示例二
import java.awt.*;
public class test
{public static void main(String []args){//创建Frame对象Frame frame = new Frame("test:BorderLayout2");//设定Frame为BorderLayout布局管理器frame.setLayout(new BorderLayout(30,5));//往Frame南北放一个按钮,中间放一个Panelframe.add(new Button("South"),BorderLayout.SOUTH);frame.add(new Button("North"),BorderLayout.NORTH);Panel panel = new Panel();panel.add(new TextField("test"));panel.add(new Button("Center"));frame.add(panel,BorderLayout.CENTER);//设置最佳大小frame.pack();frame.setVisible(true);}
}

在这里插入图片描述

Swing

以下是使用Swing的BorderLayout布局的示例代码:

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class BorderLayoutExample {public static void main(String[] args) {// 创建主窗口JFrame frame = new JFrame("BorderLayout Example");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(400, 300);// 创建面板JPanel panel = new JPanel(new BorderLayout());// 在面板上添加组件panel.add(new JButton("North"), BorderLayout.NORTH);panel.add(new JButton("South"), BorderLayout.SOUTH);panel.add(new JButton("West"), BorderLayout.WEST);panel.add(new JButton("East"), BorderLayout.EAST);panel.add(new JButton("Center"), BorderLayout.CENTER);// 将面板添加到主窗口frame.add(panel);// 显示窗口frame.setVisible(true);}
}

此示例创建了一个主窗口,并使用BorderLayout布局在面板上添加了五个按钮。每个按钮分别位于面板的不同位置(北、南、西、东和中心)。最后,将面板添加到主窗口中并显示窗口。

四、GridLayout

简介

GridLayout 布局管理器将容器分割成纵横线分隔的网格 , 每个网格所占的区域大小相同。当向使用 GridLayout 布局管理器的容器中添加组件时, 默认从左向右、 从上向下依次添加到每个网格中 。 与 FlowLayout不同的是,放置在 GridLayout 布局管理器中的各组件的大小由组件所处的区域决定(每 个组件将自动占满整个区域) 。
在这里插入图片描述

构造方法

构造方法方法功能
GridLayout(int rows,in t cols)采用指定的行数、列数,以及默认的横向间距、纵向间距将容器 分割成多个网格
GridLayout(int rows,int cols,int hgap,int vgap)采用指定 的行数、列 数 ,以及指定的横向间距 、 纵向间距将容器分割成多个网格。

代码示例

AWT

使用Frame+Panel,配合FlowLayout和GridLayout完成一个计算器效果。

import java.awt.*;
public class test
{public static void main(String []args){//创建Frame对象Frame frame = new Frame("calculator");//创建一个Paneld对象,往Panel中放置一个TextField组件Panel p1 = new Panel();p1.add(new TextField(30));//将panel放入Frame北侧frame.add(p1,BorderLayout.NORTH);//创建一个panel对象,并且设置其布局管理为GridLayoutPanel p2 = new Panel();p2.setLayout(new GridLayout(3,5,4,4));//往上述panel中,放置15个按钮,内容依次是012345……for(int i = 0 ; i < 10 ; i++){p2.add(new Button(i + ""));}p2.add(new Button("+"));p2.add(new Button("-"));p2.add(new Button("*"));p2.add(new Button("/"));p2.add(new Button("."));//把上述Panel添加到Frame的中间区域中国frame.add(p2);//设置Frame为最佳大小frame.pack();//设置Frame可见frame.setVisible(true);}
}

这段代码是一个简单的计算器程序。首先创建一个Frame对象,用来表示程序窗口,设置窗口标题为"calculator"。然后创建一个Panel对象p1,并在其中放置一个TextField组件,表示计算器的显示屏。将p1放置在Frame的北侧。接着创建一个Panel对象p2,并设置其布局管理为GridLayout,即以网格形式排列组件。在p2中依次放置15个按钮,内容包括数字0-9,以及运算符"+“、”-“、”*“、”/“和小数点”."。最后将p2添加到Frame的中间区域中。设置Frame的大小为最佳大小,并将其设置为可见。这样就完成了一个简单的计算器程序的界面设计。
在这里插入图片描述

Swing

下面是一个使用Swing的GridLayout布局管理器的简单示例:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.GridLayout;public class GridLayoutExample {public static void main(String[] args) {// 创建主窗口JFrame frame = new JFrame("GridLayout Example");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 创建一个面板并设置GridLayout布局管理器JPanel panel = new JPanel(new GridLayout(3, 3));// 在面板中添加按钮for (int i = 1; i <= 9; i++) {JButton button = new JButton(String.valueOf(i));panel.add(button);}// 将面板添加到主窗口frame.getContentPane().add(panel);// 设置主窗口的大小和可见性frame.setSize(300, 300);frame.setVisible(true);}
}

这个示例创建了一个3x3的GridLayout布局,然后在面板中添加了9个按钮。最后,将面板添加到主窗口中,并设置了主窗口的大小和可见性。运行该示例,你将会看到一个3x3的网格布局,每个单元格中都有一个按钮。

五、GridBagLayout

GridBagLayout 布局管理器的功能最强大 , 但也最复杂,与 GridLayout 布局管理器不同的是, 在GridBagLayout 布局管理器中,一个组件可以跨越一个或多个网格 , 并可以设置各网格的大小互不相同,从而增加了布局的灵活性 。 当窗口的大小发生变化时 , GridBagLayout 布局管理器也可以准确地控制窗口各部分的拉伸 。

在这里插入图片描述
由于在GridBagLayout 布局中,每个组件可以占用多个网格,此时,我们往容器中添加组件的时候,就需要具体的控制每个组件占用多少个网格,java提供的GridBagConstaints类,与特定的组件绑定,可以完成具体大小和跨越性的设置。

GridBagConstraints API

成员变量含义
gridx设置受该对象控制的GUI组件左上角所在网格的横向索引
gridy设置受该对象控制的GUI组件左上角所在网格的纵向索引
gridwidth设置受该对象控制的 GUI 组件横向跨越多少个网格,如果属性值为 GridBagContraints.REMAIND,则表明当前组件是横向最后一个组件,如果属性值为GridBagConstraints.RELATIVE,表明当前组件是横向倒数第二个组件。
gridheight设置受该对象控制的 GUI 组件纵向跨越多少个网格,如果属性值为 GridBagContraints.REMAIND,则表明当前组件是纵向最后一个组件,如果属性值为GridBagConstraints.RELATIVE,表明当前组件是纵向倒数第二个组件。
fill当"显示区域"大于"组件"的时候,如何调整组件 :
GridBagConstraints.NONE : GUI 组件不扩大
GridBagConstraints.HORIZONTAL: GUI 组件水平扩大 以 占据空白区域
GridBagConstraints.VERTICAL: GUI 组件垂直扩大以占据空白区域
GridBagConstraints.BOTH: GUI 组件水平 、 垂直同时扩大以占据空白区域.
ipadx设置受该对象控制的 GUI 组件横向内部填充的大小,即 在该组件最小尺寸的基础上还需要增大多少.
ipady设置受该对象控制的 GUI 组件纵向内部填充的大小,即 在该组件最小尺寸的基础上还需要增大多少.
insets设置受该对象控制 的 GUI 组件的 外部填充的大小 , 即该组件边界和显示区 域边界之间的 距离 .
weightx设置受该对象控制 的 GUI 组件占据多余空间的水平比例, 假设某个容器 的水平线上包括三个 GUI 组件, 它们的水平增加比例分别是 1 、 2 、 3 , 但容器宽度增加 60 像素 时,则第一个组件宽度增加 10 像素 , 第二个组件宽度增加 20 像素,第三个组件宽度增加 30 像 素。 如 果其增 加比例为 0 , 则 表示不会增加 。
weighty设置受该对象控制 的 GUI 组件占据多余空间的垂直比例
anchor设置受该对象控制 的 GUI 组件在其显示区域中的定位方式:
GridBagConstraints .CENTER (中 间 )
GridBagConstraints.NORTH (上中 )
GridBagConstraints.NORTHWEST (左上角)
GridBagConstraints.NORTHEAST (右上角)
GridBagConstraints.SOUTH (下中)
GridBagConstraints.SOUTHEAST (右下角)
GridBagConstraints.SOUTHWEST (左下角)
GridBagConstraints.EAST (右中)
GridBagConstraints.WEST (左中)

GridBagLayout使用步骤

  1. 创建GridBagLaout布局管理器对象,并给容器设置该布局管理器对象;

  2. 创建GridBagConstraints对象,并设置该对象的控制属性:

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

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

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

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

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

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

代码示例

AWT

使用Frame容器,设置GridBagLayout布局管理器,实现下图中的效果:
在这里插入图片描述

import java.awt.*;public class test {public static void main(String[] args) {//1.创建Frame对象Frame frame = new Frame("test:GridBagLayout");//2.创建GridBagLayout对象GridBagLayout gbl = new GridBagLayout();//3.把Frame对象的布局管理器设置为GridBagLayoutframe.setLayout(gbl);//4.创建GridBagConstraints对象GridBagConstraints gbc = new GridBagConstraints();//5.创建容量为10的Button数组Button[] bs = new Button[10];//6.遍历数组,初始化每一个Buttonfor (int i = 0; i < bs.length; i++) {bs[i] = new Button("Button"+(i+1));}//7.设置所有的GridBagConstraints对象的fill属性为GridBagConstraints.BOTH,当有空白区域时,组件自动扩大占满空白区域gbc.fill=GridBagConstraints.BOTH;//8.设置GridBagConstraints对象的weightx设置为1,表示横向扩展比例为1gbc.weightx=1;//9.往frame中添加数组中的前3个ButtonaddComponent(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,表示纵向扩展比例为1gbc.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);}
}

这段代码展示了如何使用GridBagLayout布局管理器来创建一个包含多个按钮的图形界面。

在主方法中,首先创建了一个Frame对象,并将其布局管理器设置为GridBagLayout。然后,创建了一个GridBagConstraints对象,并设置其中的一些属性。

接下来,创建了一个容量为10的Button数组,并通过循环初始化了每一个按钮。

通过调用addComponent方法,将前三个按钮添加到Frame中,并设置了一些约束条件。然后,将第四个按钮添加到Frame中,并设置了约束条件。

随后,设置了一些约束条件,将第五个按钮添加到Frame中。再次设置一些约束条件,将第六个按钮添加到Frame中。

接下来,分别将第七、八、九、十个按钮添加到Frame中,并设置了一些约束条件。

最后,调用pack方法设置Frame的大小,并将其设置为可见。

在代码中还定义了一个addComponent方法,用于将组件添加到容器中,并设置其约束条件。

这段代码的效果是,将按钮以不同的布局方式添加到Frame中,并根据约束条件进行布局。

Swing

以下是一个使用GridBagLayout布局的Swing示例:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;public class GridBagLayoutExample {public static void main(String[] args) {// 创建一个 JFrame 窗口JFrame frame = new JFrame("GridBagLayout Example");// 设置窗口的大小和关闭操作frame.setSize(300, 200);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 创建一个 GridBagLayout 布局管理器GridBagLayout layout = new GridBagLayout();frame.setLayout(layout);// 创建一个 GridBagConstraints 对象,用于设置组件的约束条件GridBagConstraints constraints = new GridBagConstraints();// 创建三个按钮,并设置它们的约束条件JButton button1 = new JButton("Button 1");constraints.gridx = 0;  // 指定组件的位置constraints.gridy = 0;constraints.gridwidth = 1;  // 组件所占的列数和行数constraints.gridheight = 1;layout.setConstraints(button1, constraints);  // 应用约束条件frame.add(button1);  // 将按钮添加到窗口中JButton button2 = new JButton("Button 2");constraints.gridx = 1;constraints.gridy = 0;constraints.gridwidth = 2;constraints.gridheight = 1;layout.setConstraints(button2, constraints);frame.add(button2);JButton button3 = new JButton("Button 3");constraints.gridx = 0;constraints.gridy = 1;constraints.gridwidth = 3;constraints.gridheight = 1;layout.setConstraints(button3, constraints);frame.add(button3);// 设置窗口可见frame.setVisible(true);}
}

这个示例创建了一个使用GridBagLayout布局管理器的JFrame窗口,并在窗口中添加了三个按钮。通过设置GridBagConstraints对象的属性,可以控制每个按钮的位置和大小。最后,调用frame.setVisible(true);使窗口可见。

六、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 容器中指定名字的卡片.

代码示例

AWT

使用Frame和Panel以及CardLayout完成下图中的效果,点击底部的按钮,切换卡片
在这里插入图片描述

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class test {public static void main(String[] args) {//1.创建Frame对象Frame frame = new Frame("test:CardLayout");//2.创建一个String数组,存储不同卡片的名字String[] names = {"one","two","three","four","five"};//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() {@Overridepublic void actionPerformed(ActionEvent e) {String command = e.getActionCommand();switch (command){case "back":cardLayout.previous(p1);break;case "next":cardLayout.next(p1);break;case "one":cardLayout.first(p1);break;case "end":cardLayout.last(p1);break;case "three":cardLayout.show(p1,"three");break;}}};Button b1 = new Button("back");Button b2 = new Button("next");Button b3 = new Button("one");Button b4 = new Button("end");Button b5 = new Button("three");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);}
}

Swing

下面是一个使用Swing的CardLayout实现的简单示例:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class CardLayoutExample {private JFrame frame;private JPanel cardPanel;private CardLayout cardLayout;public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {new CardLayoutExample().createAndShowGUI();}});}private void createAndShowGUI() {frame = new JFrame("CardLayout Example");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);cardLayout = new CardLayout();cardPanel = new JPanel(cardLayout);createCards();JButton prevButton = new JButton("Previous");JButton nextButton = new JButton("Next");prevButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {cardLayout.previous(cardPanel);}});nextButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {cardLayout.next(cardPanel);}});JPanel buttonPanel = new JPanel();buttonPanel.add(prevButton);buttonPanel.add(nextButton);frame.add(cardPanel, BorderLayout.CENTER);frame.add(buttonPanel, BorderLayout.SOUTH);frame.pack();frame.setVisible(true);}private void createCards() {JPanel card1 = new JPanel();card1.add(new JLabel("Card 1"));cardPanel.add(card1, "Card 1");JPanel card2 = new JPanel();card2.add(new JLabel("Card 2"));cardPanel.add(card2, "Card 2");JPanel card3 = new JPanel();card3.add(new JLabel("Card 3"));cardPanel.add(card3, "Card 3");}
}

这段代码创建了一个带有三个面板的CardLayout。通过点击"Previous"和"Next"按钮,可以在这三个面板之间进行切换。每个面板都包含一个简单的标签,以显示当前所在的面板。

七、BoxLayout

简介

为了简化开发,Swing 引入了 一个新的布局管理器 : BoxLayout 。

BoxLayout 可以在垂直和 水平两个方向上摆放 GUI 组件, BoxLayout 提供了如下一个简单的构造器

方法名称1

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

代码示例1

使用Frame和BoxLayout完成下图效果

在这里插入图片描述

import javax.swing.*;
import java.awt.*;public class test {public static void main(String[] args) {//1.创建Frame对象Frame frame = new Frame("test: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);}
}

方法名称2

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

方法名称方法功能
static Box createHorizontalBox()创建一个水平排列组件的 Box 容器 。
static Box createVerticalBox()创建一个垂直排列组件的 Box 容器 。

代码示例2

使用Frame和Box,完成下图效果
在这里插入图片描述

import javax.swing.*;
import java.awt.*;public class test {public static void main(String[] args) {//1.创建Frame对象Frame frame = new Frame("test:BoxLayout");//2.创建一个横向的Box,并添加两个按钮Box hBox = Box.createHorizontalBox();hBox.add(new Button("x:1"));hBox.add(new Button("x:2"));//3.创建一个纵向的Box,并添加两个按钮Box vBox = Box.createVerticalBox();vBox.add(new Button("y:1"));vBox.add(new Button("y:2"));//4.把box容器添加到frame容器中frame.add(hBox,BorderLayout.NORTH);frame.add(vBox);//5.设置frame最佳大小并可见frame.pack();frame.setVisible(true);}
}

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

设置间隔

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

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

方法名称方法功能
static Component createHorizontalGlue()创建一条水平 Glue (可在两个方向上同时拉伸的间距)
static Component createVerticalGlue()创建一条垂直 Glue (可在两个方向上同时拉伸的间距)
static Component createHorizontalStrut(int width)创建一条指定宽度(宽度固定了,不能拉伸)的水平Strut (可在垂直方向上拉伸的间距)
static Component createVerticalStrut(int height)创建一条指定高度(高度固定了,不能拉伸)的垂直Strut (可在水平方向上拉伸的间距)

代码示例

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

在这里插入图片描述

import javax.swing.*;
import java.awt.*;public class test {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);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/28848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java项目常用包的分层和作用

一个好的Java项目要有好的分层&#xff0c;不仅简洁明了&#xff0c;而且降低代码的耦合度&#xff0c;方便维护和升级。 web层 在Java Web应用程序中&#xff0c;Web层通常指的是处理HTTP请求和响应的层次&#xff0c;它直接与客户端&#xff08;通常是Web浏览器&#xff09…

【一】【QT开发应用】QT开发环境配置,安装QT应用

下载QT软件 点击网址链接&#xff0c;QT下载网址 下载vsaddin插件 点击网址链接&#xff0c;QT下载网址 根据自己的vs版本下载对应的文件. 安装QT 用命令行打开安装程序 找到直接路径, D:\Software\QT\qt-unified-windows-x86-4.3.0-1-online.exe 利用WindowsPowe…

Python自动化测试面试题精选(一)

今天大家介绍一些Python自动化测试中常见的面试题&#xff0c;涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容&#xff0c;希望能够帮助你提升自己的水平和信心。 项目相关 什么项目适合做自动化测试&#xff1f; 答&#xff1a;一般来说&#xff0c;适合做自…

文档项目:攻坚克难

鉴于交流离心机存在的缺点&#xff1a;转速相对偏差、稳定精度不够高&#xff1b;带负载能力受外界扰动后&#xff0c;波动较大&#xff1b;寿命短&#xff0c;研究所各相关部门成立组成技术攻关团队&#xff0c;齐心协力&#xff0c;攻坚克难&#xff0c;在摸索中突破创新&…

坚持刷题|合并有序链表

文章目录 题目思考代码实现迭代递归 扩展实现k个有序链表合并方法一方法二 PriorityQueue基本操作Java示例注意事项 Hello&#xff0c;大家好&#xff0c;我是阿月。坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;消失了一段时间&#xff0c;我又回来刷题啦&#xff0c;今天…

【调试笔记-20240612-Linux-在 QEMU 中配置 OpenWrt-23.05 支持访问 Windows 宿主机的共享目录】

调试笔记-系列文章目录 调试笔记-20240612-Linux-在 QEMU 中配置 OpenWrt-23.05 支持访问 Windows 宿主机的共享目录 文章目录 调试笔记-系列文章目录调试笔记-20240612-Linux-在 QEMU 中配置 OpenWrt-23.05 支持访问 Windows 宿主机的共享目录 前言一、调试环境操作系统&…

大模型泡沫退去,谁能活到下半场?

前言 从今年3月开始&#xff0c;国内企业纷纷下场大模型&#xff0c;铆足劲秀肌肉&#xff0c;如今转向垂直行业淘金&#xff0c;试图争霸行业大模型。我们的心态也逐渐从看乐子&#xff0c;到严肃讨论。 在人工智能的世界&#xff0c;我们经历了众多的概念游戏&#xff0c;在…

2021 hnust 湖科大 数据结构课堂实验代码及报告

2021 hnust 湖科大 数据结构课堂实验代码及报告 目录 实验1 线性表 1 实验2 栈的应用 4 实验3 队列的应用 9 实验4 串的应用 16 实验5 二叉树遍历 19 实验6 哈夫曼编码 23 实验7 图的遍历 27 实验8 最小生成树 32 实验9 最短路径 35 实验10 折半查找 37 实验11 插入排序与交换…

python实践笔记(三): 异常处理和文件操作

1. 写在前面 最近在重构之前的后端代码&#xff0c;借着这个机会又重新补充了关于python的一些知识&#xff0c; 学习到了一些高效编写代码的方法和心得&#xff0c;比如构建大项目来讲&#xff0c;要明确捕捉异常机制的重要性&#xff0c; 学会使用try...except..finally&…

《Java2实用教程》 期末考试整理

作用域 当前类 当前包 子类 其他包 public √ √ √ √ protected √ √ √ default √ √ private √ 三、问答题&#xff08;每小题4分&#xff0c;共8分&#xff09; 1.类与对象的关系 对象&#xff1a;对象是类的一个实例&#xff0c;有状…

【实用工具】Skyworking

文章目录 一、Skywalking概述1.1 核心功能1.2 指标概述1.2.1 一些常用指标1.2.2 指标的使用方式 二、仪表盘2.1 APM2.1.1 全局维度的指标2.1.2 服务维度的指标2.1.3 实例维度的指标2.1.4 端点维度的指标 2.2 数据库2.3 其他 三、追踪3.1 界面划分3.2 请求链路界面分析3.3 一般流…

Diffusion 扩散模型(DDPM)

Diffusion 扩散模型&#xff08;DDPM&#xff09; 一、什么是扩散模型&#xff1f; 随着Stable Diffusion 3的问世&#xff0c;AI绘画再次成为最为火热的AI方向之一&#xff0c;那么不可避免地再次会问到Stable Diffusion里的这个”Diffusion”到底是什么&#xff1f;其实扩散…

typora下载安装、激活教程

目录 介绍 基本功能 使用教程 高级功能 下载安装 激活 关闭软件每次启动时的已激活弹窗 去除软件左下角“未激活”提示 介绍 Typora 是一款功能强大的 Markdown 编辑器&#xff0c;它以其简洁的界面设计和高效的文本编辑能力受到许多用户的青睐。Typora 的主要特点在于…

Socket编程模型

一、整体过程图解 二、Socket编程模型细节 客户端和服务器能在网络中通信&#xff0c;那必须得使用Socket编程&#xff0c;它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。 创建Socket 的时候&#xff0c;可以指定网络层使用的是IPv4还是IPv6&#xff0c;传…

jvm必知必会-类的生命周期图文详解

类的生命周期描述了一个从加载、使用到卸载的过程; 而其中的 连接 部分又分为一下三个阶段: 验证准备解析6.1 加载阶段 Loading阶段第一步是 类加载器 会根据类全限定名通过不同的渠道以二进制流的方式获取字节码信息,程序员可以使用Java代码扩展不同的渠道。 比如通过 …

LeetCode 算法:螺旋矩阵c++

原题链接&#x1f517;&#xff1a;螺旋矩阵 难度&#xff1a;中等⭐️⭐️ 题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…

实用技巧:跳过TCODE权限检查ALINK_CALL_TRANSACTION

RFC&#xff1a;ALINK_CALL_TRANSACTION 遇到tcode 提示没有权限打开&#xff0c;可以通过这个RFC,debug 修改检查值&#xff0c;打开TCODE。 适用于紧急情况 断点打在20行&#xff0c;SY-SUBRC 的值改成 1

【ARMv8/ARMv9 硬件加速系列 3.4 -- SVE 复制指令CPY 使用介绍】

文章目录 SVE 复制指令CPYSVE 指令格式SVE 使用语法SVE CPY 使用示例SVE CPY 小结SVE 复制指令CPY CPY <Zd>.<T>, <Pg>/M, #<imm>{, <shift>}cpy 指令在 ARMv9 的

MySQL的卸载

先停止对应MySQL服务&#xff0c;然后再进行删除&#xff08;进入MySQL安装目录bin目录内以管理员身份打开命令行&#xff09; 停止服务 net stop Mysql&#xff08;服务名&#xff09; ——MySQL&#xff08;服务名&#xff09;安装时是什么名字就写什么名字 卸载 mysqld …

在矩池云快速使用ChatTTS,文本转语音太酷了

ChatTTS 最新的一款文本转语音模型&#xff0c;目前支持英文和中文两种语言&#xff0c;面向对话场景的转化则更为精准&#xff0c;在汉语的语音韵律方面超越了以往很多同类模型&#xff0c;此外它还支持细粒度控制&#xff0c;允许在文字中加入笑声、停顿、语气词等&#xff0…