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

 更新时间:2019年12月05日 10:01:38   作者:xietansheng  
这篇文章主要介绍了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

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

相关文章

  • 一文掌握Spring Cookie和Session 是什么及区别介绍

    一文掌握Spring Cookie和Session 是什么及区别介绍

    Cookie和Session都是用于在客户端和服务器之间传递信息的技术,但它们的工作方式和使用场景有所不同,Cookie是在客户端保存用户信息的一种机制,而Session是在服务器端保存用户信息的一种机制,本文介绍Spring Cookie和Session 是什么,感兴趣的朋友一起看看吧
    2025-01-01
  • 如何在springboot中引入参数校验

    如何在springboot中引入参数校验

    一般我们判断前端传过来的参数,需要对某些值进行判断,是否满足条件,而springboot相关的参数校验注解,可以解决我们这个问题,本文给大家介绍如何在springboot中引入参数校验,感兴趣的朋友一起看看吧
    2023-12-12
  • Spring+Mybatis动态切换数据源的方法

    Spring+Mybatis动态切换数据源的方法

    这篇文章主要为大家详细介绍了Spring+Mybatis动态切换数据源的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java数组声明、创建、初始化基础

    Java数组声明、创建、初始化基础

    本文讲述了Java数组的几个相关的方面,讲述了对Java数组的声明、创建和初始化,并给出其对应的代码
    2012-12-12
  • java接口用户上下文的设计与实现

    java接口用户上下文的设计与实现

    这篇文章主要为大家介绍了接口用户上下文的设计与实现实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • maven中profile动态打包不同环境配置文件的实现

    maven中profile动态打包不同环境配置文件的实现

    开发项目时会遇到这个问题:开发环境,测试环境,生产环境的配置文件不同, 打包时经常要手动更改配置文件,本文就来介绍一下maven中profile动态打包不同环境配置文件的实现,感兴趣的可以了解一下
    2023-10-10
  • 关于Java集合框架面试题(含答案)下

    关于Java集合框架面试题(含答案)下

    Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点。这里,我列出了一些关于Java集合的重要问题和答案。
    2015-12-12
  • Java Hibernate使用SessionFactory创建Session案例详解

    Java Hibernate使用SessionFactory创建Session案例详解

    这篇文章主要介绍了Java Hibernate使用SessionFactory创建Session案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringBoot MP简单的分页查询测试实现步骤分解

    SpringBoot MP简单的分页查询测试实现步骤分解

    好久没水后端的东西了,最近在做vue项目写前端的代码,所以cloud也停进度了,吃完饭突然记得我没有在博客里写分页的东西,虽然项目中用到了,但是没有拎出来,这里就拎出来看看
    2023-04-04
  • SpringBoot + Disruptor实现特快高并发处理及使用Disruptor高速实现队列的过程

    SpringBoot + Disruptor实现特快高并发处理及使用Disruptor高速实现队列的过程

    Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟,这篇文章主要介绍了SpringBoot + Disruptor 实现特快高并发处理,使用Disruptor高速实现队列,需要的朋友可以参考下
    2023-11-11

最新评论