Java GUI编程(14)---弹性布局SpringLayout

本文详细介绍了 Java Swing 中的 SpringLayout 弹性布局,包括其特点、使用方法及如何通过 SpringLayout 和 SpringLayout.Constraints 类来实现组件的动态布局调整。通过具体示例代码展示了如何设置组件间的相对位置和间距,使组件能在窗口大小变化时自动调整布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringLayout,弹性布局

特点: 改变窗体的大小时, 自动调整组件的大小布满整个窗体(不改变组件间相对位置)。

如下图,组件A、组件B与容器各边距保持约束距离不变(位置不变),组件的大小可变,是一种约束关系,类SpringLayout SpringLayout.Constraints  Spring 配合使用用来管理。

1,SpringLayout

获取组件或容器的约束对象

SpringLayout layout = new SpringLayout(); //创建弹性布局类对象

JPanel jp = new JPanel(layout); //容器使用对象

JButton btn = new JButton("Button");

jp.add(btn);

//每个组件实例都对应着一个约束对象

SpringLayout.Constraints btnCons = layout.getConstraints(btn); //按钮约束对象

SpringLayout.Constraints jpCons = layout.getConstraints(jp);// 容器约束对象

2, SpringLayout.Constraints

通过该约束可以获取和设置组件四条边的坐标宽高,

3,常用方法

//各个边之间建立约束

putConstraint(String e1, Component c1, int pad, String e2, Component c2)

e1:需要参考的组件对象的具体需要参考的边

c1:需要参考的组件对象

pad:两条边之间的距离(两个组件的间距)

e2:被参考的组件对象的具体被参考的边

c2:被参考的组件对象(也可以是需要参考的组件对象所属的容器对象)

(注意:e2e1的北侧或西侧的时,pad应为正数;当e2e1的南侧或东侧的时,pad应为负数

e1和e2的静态常量:EAST(组件东侧的边)、WEST(组件西侧的边)、NORTH(组件北侧的边)、SOUTH(组件南侧的边)

布局设计

演示代码


package com.msh.util;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
import static javax.swing.SpringLayout.*;
import javax.swing.WindowConstants;

public class Demo1SpringLayout {

    public static void main(String[] args) {
        JFrame jf = new JFrame("演示弹性布局"); //创建窗口
        jf.setSize(500, 300);
        JPanel jp = new JPanel();
        jf.setContentPane(jp);
        SpringLayout springLayout = new SpringLayout();
        jp.setLayout(springLayout);//设置布局格式为弹簧式
        
        //标签组件1的位置约束
        JLabel label1 = new JLabel("项目名称: ");
        jp.add(label1);
        springLayout.putConstraint(NORTH, label1, 10, NORTH, jp);  //标签1北侧——>容器北侧
        springLayout.putConstraint(WEST, label1, 10, WEST, jp);    //标签1西侧——>容器西侧 10
        
        //文本框组件的位置约束
        JTextField txtF1 = new JTextField();
        jp.add(txtF1);
        springLayout.putConstraint(NORTH, txtF1, 10, NORTH, jp);//文本框北侧——>容器北侧
        springLayout.putConstraint(WEST, txtF1, 10, EAST, label1);//文本框西侧——>主题标签东侧
        springLayout.putConstraint(EAST, txtF1, -50, EAST, jp);// 文本框东侧——>容器东侧
        
        //标签组件2的位置约束
        JLabel label2= new JLabel("项目内容: ");
        jp.add(label2);
        springLayout.putConstraint(NORTH, label2, 20, SOUTH, label1);// 内容标签北侧(参照文本框是因为文本框高)——>主题文本框南侧
        springLayout.putConstraint(WEST, label2, 10, WEST, jp);// 内容标签西侧——>容器西侧

        //滚动面板,内置文本框架
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(new JTextArea());
        jp.add(scrollPane);
        springLayout.putConstraint(NORTH, scrollPane, 20, SOUTH, txtF1);// 滚动面板北侧——>文本框南侧
        springLayout.putConstraint(WEST, scrollPane, 10, EAST, label2);// 滚动面板西侧——>内容标签东侧
	springLayout.putConstraint(EAST, scrollPane, -50, EAST, jp);// 滚动面板东侧——>容器东侧
        
        JButton Btn01 = new JButton("清空");
        jp.add(Btn01);
	springLayout.putConstraint(SOUTH, Btn01, -50, SOUTH,jp);// 按钮1南侧——>容器南侧
        //springLayout.putConstraint(WEST, resetButton, 50, WEST, jp);    //按钮1西侧——>容器西侧 10
        
        JButton Btn02 = new JButton("新增");
	jp.add(Btn02);
	springLayout.putConstraint(SOUTH, Btn02, -50, SOUTH,jp);// 按钮2南侧——>容器南侧
	springLayout.putConstraint(EAST, Btn02, -50, EAST,jp);// 按钮2东侧——>容器东侧
	springLayout.putConstraint(SOUTH, scrollPane, -20, NORTH,Btn02);// 滚动面板南侧——>“确定”按钮北侧
	springLayout.putConstraint(EAST, Btn01, -50, WEST,Btn02);// “清空”按钮东侧——>“确定”按钮西侧
        
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setVisible(true);  // 显示窗口
        
    }    
}

运行效果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值