Java Swing SpringLayout弹性布局的实现代码

1. 概述

官方JavaDocsApi:

SpringLayout,弹性布局管理器。使用该布局的容器内的 每一个组件或容器都对应着一个约束,通过该约束定义组件或容器四条边的坐标位置 来实现对组件的布局。该布局主要涉及三个类: SpringLayout、SpringLayout.Constraints、Spring,分别表示 布局管理器、约束、坐标距离。

(1)SpringLayout

表示一个布局管理器,通过该布局管理器可以获取组件或容器的约束对象,如下:

// 创建 弹性布局管理器 和 容器,容器 使用 弹性布局
SpringLayout layout = new SpringLayout();
JPanel panel = new JPanel(layout);

// 创建 按钮组件,并添加到 容器
JButton btn = new JButton("Button");
panel.add(btn);

// 获取 按钮组件 的 约束对象(如果没有,会自动创建)
SpringLayout.Constraints btnCons = layout.getConstraints(btn);
// 获取 容器组件 的 约束对象(如果没有,会自动创建)
SpringLayout.Constraints panelCons = layout.getConstraints(panel);

(2)SpringLayout.Constraints

表示对 组件位置和尺寸的约束,每个组件实例都对应着一个约束对象,通过该约束可以 获取和设置 组件四条边的 坐标和宽高,常用方法如下:

/*
 * 组件左上角坐标的设置(这里 X 相当于 WEST,Y 相当于 NORTH)
 */
void  setX(Spring x)
void  setY(Spring y)
Spring getX()
Spring getY()

/*
 * 组件宽高的设置
 */
void  setWidth(Spring w)
void  setHeight(Spring h)
Spring getHeight()
Spring getWidth()

/*
 * 组件指定边的的坐标或长度设置
 * edgeName 的值为如下常量之一:
 *   SpringLayout.NORTH, SpringLayout.SOUTH, SpringLayout.EAST, SpringLayout.WEST
 *   SpringLayout.HORIZONTAL_CENTER, SpringLayout.VERTICAL_CENTER
 *   SpringLayout.BASELINE
 *   SpringLayout.WIDTH, SpringLayout.HEIGHT
 */
Spring getConstraint(String edgeName)
void  setConstraint(String edgeName, Spring s)

(3)Spring

Spring 可以看做是在 SpringLayout 中对 距离的度量。一个 Spring 实例,表示一段距离或长度,并且支持简单的算术运算(通过 Spring 提供的静态方法进行计算),常用方法如下:

// 创建一个指定长度的 spring
static Spring constant(int pref)

// 两个 spring 相加,得到新的一个 spring
static Spring sum(Spring s1, Spring s2)

// 计算两个 spring 之间的较大者
static Spring max(Spring s1, Spring s2)

// 对 spring 的缩放
static Spring scale(Spring s, float factor)

// 计算指定组件的宽度所表示的 spring
static Spring width(Component c)

// 计算指定组件的高度所表示的 spring
static Spring height(Component c)

// 对 spring 所表示的数值大小的获取和设置
int  getValue()
void setValue(int value)

2. 代码实例

package com.xiets.swing;

import javax.swing.*;

public class Main {

  public static void main(String[] args) {
    // 创建窗口
    JFrame jf = new JFrame("测试窗口");
    jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    jf.setSize(300, 200);
    jf.setLocationRelativeTo(null);

    // 创建内容面板,使用 弹性布局
    SpringLayout layout = new SpringLayout();
    JPanel panel = new JPanel(layout);
    jf.setContentPane(panel);

    // 创建组件
    JLabel label = new JLabel("Test JLabel: ");
    JButton btn = new JButton("Btn");
    JTextField textField = new JTextField("Text Field");

    // 添加组件到内容面板
    panel.add(label);
    panel.add(btn);
    panel.add(textField);

    /*
     * 组件的约束设置(弹性布局设置的关键)
     */

    // 标签组件约束: 设置标签的左上角坐标为 (5, 5)
    SpringLayout.Constraints labelCons = layout.getConstraints(label); // 从布局中获取指定组件的约束对象(如果没有,会自动创建)
    labelCons.setX(Spring.constant(5));
    labelCons.setY(Spring.constant(5));

    // 按钮组件约束: 设置左上角 水平坐标为5, 垂直坐标为 标签的南边坐标;设置东边坐标为 标签的东边坐标
    SpringLayout.Constraints btnCons = layout.getConstraints(btn);
    btnCons.setX(Spring.constant(5));
    btnCons.setY(labelCons.getConstraint(SpringLayout.SOUTH));
    btnCons.setConstraint(SpringLayout.EAST, labelCons.getConstraint(SpringLayout.EAST));

    // 文本框约束: 设置左上角 水平坐标为 标签的东边坐标 + 5, 垂直坐标为 5
    SpringLayout.Constraints textFieldCons = layout.getConstraints(textField);
    textFieldCons.setX(
        Spring.sum(
            labelCons.getConstraint(SpringLayout.EAST),
            Spring.constant(5)
        )
    );
    textFieldCons.setY(Spring.constant(5));

    /*
     * 内容面板(容器)的约束设置,即确定 组件 和 容器的右边和底边 之间的间隙大小
     */
    SpringLayout.Constraints panelCons = layout.getConstraints(panel); // 获取容器的约束对象

    // 设置容器的 东边坐标 为 文本框的东边坐标 + 5
    panelCons.setConstraint(
        SpringLayout.EAST,
        Spring.sum(
            textFieldCons.getConstraint(SpringLayout.EAST),
            Spring.constant(5)
        )
    );

    // 计算出 按钮 和 文本框 的 南边坐标 的 值较大者
    Spring maxHeightSpring = Spring.max(
        btnCons.getConstraint(SpringLayout.SOUTH),
        textFieldCons.getConstraint(SpringLayout.SOUTH)
    );

    // 设置容器的 南边坐标 为 maxHeightSpring + 5
    panelCons.setConstraint(
        SpringLayout.SOUTH,
        Spring.sum(
            maxHeightSpring,
            Spring.constant(5)
        )
    );

    // 显示窗口
    jf.setVisible(true);
  }

}

结果展示:

SpringLayout 更详细具体的介绍和使用方式,详见 Java 官方文档: How to Use SpringLayout

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java中Swing五种常见的布局方式

    1. 边界布局(BorderLayout) 2.流式布局(FlowLayout) 3.网格布局(GridLayout) 4.盒子布局(BoxLaYout) 5.空布局(null) 还有其他两种布局,分别是GridBagLayout(网格包布局).CardLayout(卡片布局) 注意:JFrame和JDialog默认布局为BorderLayout,JPanel和Applet默认布局为FlowLayout 边界布局示例代码: import java.awt.BorderLayout; import

  • Java Swing BoxLayout箱式布局的实现代码

    1. 概述 官方JavaDocsApi: javax.swing.BoxLayout,javax.swing.Box BoxLayout,箱式布局管理器.它把若干组件按水平或垂直方向依次排列放置.Swing 提供了一个实现了 BoxLayout 的容器组件Box.使用 Box 提供的静态方法,可快速创建水平/垂直箱容器(Box),以及填充组件之间空隙的不可见组件.用水平箱和垂直箱的组合嵌套可实现类似于 GridBagLayout 的效果,但没那么复杂. 创建水平/垂直箱容器(Box): // 创

  • Java Swing组件布局管理器之FlowLayout(流式布局)入门教程

    本文实例讲述了Java Swing组件布局管理器之FlowLayout(流式布局).分享给大家供大家参考,具体如下: FlowLayout应该是Swing布局管理器学习中最简单.最基础的一个.所谓流式,就是内部控件像水流一样,从前到后按顺序水平排列,直到达到容器的宽度时跳转到第二行.既然是水平排列,那么就存在三种基本的对齐方式:居中对齐(CENTER ).左对齐(LEFT )和右对齐(RIGHT ).然而,FlowLayout还提供两种对齐方式:LEADING,表示控件与容器方向开始边对应:TR

  • Java Swing GroupLayout分组布局的实现代码

    1. 概述 官方JavaDocsApi: javax.swing.GroupLayout GroupLayout,分组布局管理器.它将组建按层次分组,以决定它们在 Container 中的位置.GroupLayout 主要供生成器使用(生成 并行组 和 串行组).分组由GroupLayout.Group类的实例来完成,每个组可以包含任意数量的元素(Group.Component 或 Gap). GroupLayout支持两种组: 串行组 (sequential group):按顺序沿指定方向(水

  • Java编程使用箱式布局管理器示例【基于swing组件】

    本文实例讲述了Java编程使用箱式布局管理器.分享给大家供大家参考,具体如下: 先来看看运行效果: 完整代码如下: package awtDemo; import java.awt.BorderLayout; import java.awt.Container; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax

  • Java Swing GridBagLayout网格袋布局的实现

    1. 布局: GridBagLayout 官方JavaDocsApi: java.awt.GridBagLayout GridBagLayout,网格袋布局管理器.它不要求组件的大小相同便可以将组件垂直.水平或沿它们的基线对齐.每个 GridBagLayout 对象维持一个动态的矩形单元格(动态计算出单个单元格的大小),每个组件占用一个或多个的单元格,该单元格被称为 显示区域.每个组件显示区域按 从左到右,从上到下,依次排列. 2. 约束: GridBagConstraints GridBagC

  • JavaSwing FlowLayout 流式布局的实现

    1. 概述 官方JavaDocsApi: java.awt.FlowLayout FlowLayout,流式布局管理器.按水平方向依次排列放置组件,排满一行,换下一行继续排列.排列方向(左到右 或 右到左)取决于容器的componentOrientation属性(该属性属于Component),它可能的值如下: ComponentOrientation.LEFT_TO_RIGHT(默认) ComponentOrientation.RIGHT_TO_LEFT 同一行(水平方向)的组件的对齐方式由

  • Java Swing组件BoxLayout布局用法示例

    本文实例讲述了Java Swing组件BoxLayout布局用法.分享给大家供大家参考,具体如下: BoxLayout 可以把控件依次进行水平或者垂直排列布局,这是通过参数 X_AXIS.Y_AXIS 来决定的.X_AXIS 表示水平排列,而 Y_AXIS 表示垂直排列.BoxLayout 的构造函数有两个参数,一个参数定义使用该 BoxLayout 的容器,另一个参数是指定 BoxLayout 是采用水平还是垂直排列.下面是一个使用 BoxLayout排列控件的例子: JPanel panel

  • Java Swing CardLayout卡片布局的实现示例

    1. 概述 官方JavaDocsApi: javax.swing.CardLayout CardLayout,卡片布局管理器.它将容器中的每个组件看作一张卡片,一次只能看到一张卡片,容器则充当卡片的堆栈,默认显示第一张卡片. CardLayout 构造方法: // 创建一个间距大小为 0 的卡片布局 CardLayout() // 创建一个指定水平/垂直间距大小的卡片布局. CardLayout(int hgap, int vgap) CardLayout 常用方法: // 显示第一张卡片 vo

  • JavaSwing GridLayout 网格布局的实现代码

    1. 概述 官方JavaDocsApi: java.awt.GridLayout GridLayout,网格布局管理器.它以矩形网格形式对容器的组件进行布置,把容器按行列分成大小相等的矩形网格,一个网格中放置一个组件,组件宽高自动撑满网格. 以行数和总数优先: 通过构造方法或 setRows 和 setColumns 方法将行数和列数都设置为非零值时,指定的列数将被忽略.列数通过指定的行数和布局中的组件总数来确定.因此,例如,如果指定了三行和两列,在布局中添加了九个组件,则它们将显示为三行三列.

  • JavaSwing BorderLayout 边界布局的实现代码

    1. 概述 官方JavaDocsApi: java.awt.BorderLayout BorderLayout,边界布局管理器.它把 Container 按方位分为 5 个区域(东.西.南.北.中),每个区域放置一个组件. BorderLayout 构造方法: // 构造一个组件之间没有间距的新边框布局 BorderLayout() // 构造一个具有指定组件间距的边框布局 BorderLayout(int hgap, int vgap) BorderLayout 表示方位的 5 个常量: Bo

  • Java编程使用卡片布局管理器示例【基于swing组件】

    本文实例讲述了Java编程使用卡片布局管理器.分享给大家供大家参考,具体如下: 运行效果: 完整示例代码: package com.han; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JB

随机推荐