Java Swing SpringLayout彈性布局的實(shí)現(xiàn)代碼
1. 概述
官方JavaDocsApi:
SpringLayout,彈性布局管理器。使用該布局的容器內(nèi)的 每一個(gè)組件或容器都對(duì)應(yīng)著一個(gè)約束,通過(guò)該約束定義組件或容器四條邊的坐標(biāo)位置 來(lái)實(shí)現(xiàn)對(duì)組件的布局。該布局主要涉及三個(gè)類: SpringLayout、SpringLayout.Constraints、Spring,分別表示 布局管理器、約束、坐標(biāo)距離。
(1)SpringLayout
表示一個(gè)布局管理器,通過(guò)該布局管理器可以獲取組件或容器的約束對(duì)象,如下:
// 創(chuàng)建 彈性布局管理器 和 容器,容器 使用 彈性布局 SpringLayout layout = new SpringLayout(); JPanel panel = new JPanel(layout); // 創(chuàng)建 按鈕組件,并添加到 容器 JButton btn = new JButton("Button"); panel.add(btn); // 獲取 按鈕組件 的 約束對(duì)象(如果沒(méi)有,會(huì)自動(dòng)創(chuàng)建) SpringLayout.Constraints btnCons = layout.getConstraints(btn); // 獲取 容器組件 的 約束對(duì)象(如果沒(méi)有,會(huì)自動(dòng)創(chuàng)建) SpringLayout.Constraints panelCons = layout.getConstraints(panel);
(2)SpringLayout.Constraints
表示對(duì) 組件位置和尺寸的約束,每個(gè)組件實(shí)例都對(duì)應(yīng)著一個(gè)約束對(duì)象,通過(guò)該約束可以 獲取和設(shè)置 組件四條邊的 坐標(biāo)和寬高,常用方法如下:
/* * 組件左上角坐標(biāo)的設(shè)置(這里 X 相當(dāng)于 WEST,Y 相當(dāng)于 NORTH) */ void setX(Spring x) void setY(Spring y) Spring getX() Spring getY() /* * 組件寬高的設(shè)置 */ void setWidth(Spring w) void setHeight(Spring h) Spring getHeight() Spring getWidth() /* * 組件指定邊的的坐標(biāo)或長(zhǎng)度設(shè)置 * 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 中對(duì) 距離的度量。一個(gè) Spring 實(shí)例,表示一段距離或長(zhǎng)度,并且支持簡(jiǎn)單的算術(shù)運(yùn)算(通過(guò) Spring 提供的靜態(tài)方法進(jìn)行計(jì)算),常用方法如下:
// 創(chuàng)建一個(gè)指定長(zhǎng)度的 spring static Spring constant(int pref) // 兩個(gè) spring 相加,得到新的一個(gè) spring static Spring sum(Spring s1, Spring s2) // 計(jì)算兩個(gè) spring 之間的較大者 static Spring max(Spring s1, Spring s2) // 對(duì) spring 的縮放 static Spring scale(Spring s, float factor) // 計(jì)算指定組件的寬度所表示的 spring static Spring width(Component c) // 計(jì)算指定組件的高度所表示的 spring static Spring height(Component c) // 對(duì) spring 所表示的數(shù)值大小的獲取和設(shè)置 int getValue() void setValue(int value)
2. 代碼實(shí)例
package com.xiets.swing; import javax.swing.*; public class Main { public static void main(String[] args) { // 創(chuàng)建窗口 JFrame jf = new JFrame("測(cè)試窗口"); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); jf.setSize(300, 200); jf.setLocationRelativeTo(null); // 創(chuàng)建內(nèi)容面板,使用 彈性布局 SpringLayout layout = new SpringLayout(); JPanel panel = new JPanel(layout); jf.setContentPane(panel); // 創(chuàng)建組件 JLabel label = new JLabel("Test JLabel: "); JButton btn = new JButton("Btn"); JTextField textField = new JTextField("Text Field"); // 添加組件到內(nèi)容面板 panel.add(label); panel.add(btn); panel.add(textField); /* * 組件的約束設(shè)置(彈性布局設(shè)置的關(guān)鍵) */ // 標(biāo)簽組件約束: 設(shè)置標(biāo)簽的左上角坐標(biāo)為 (5, 5) SpringLayout.Constraints labelCons = layout.getConstraints(label); // 從布局中獲取指定組件的約束對(duì)象(如果沒(méi)有,會(huì)自動(dòng)創(chuàng)建) labelCons.setX(Spring.constant(5)); labelCons.setY(Spring.constant(5)); // 按鈕組件約束: 設(shè)置左上角 水平坐標(biāo)為5, 垂直坐標(biāo)為 標(biāo)簽的南邊坐標(biāo);設(shè)置東邊坐標(biāo)為 標(biāo)簽的東邊坐標(biāo) 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)); // 文本框約束: 設(shè)置左上角 水平坐標(biāo)為 標(biāo)簽的東邊坐標(biāo) + 5, 垂直坐標(biāo)為 5 SpringLayout.Constraints textFieldCons = layout.getConstraints(textField); textFieldCons.setX( Spring.sum( labelCons.getConstraint(SpringLayout.EAST), Spring.constant(5) ) ); textFieldCons.setY(Spring.constant(5)); /* * 內(nèi)容面板(容器)的約束設(shè)置,即確定 組件 和 容器的右邊和底邊 之間的間隙大小 */ SpringLayout.Constraints panelCons = layout.getConstraints(panel); // 獲取容器的約束對(duì)象 // 設(shè)置容器的 東邊坐標(biāo) 為 文本框的東邊坐標(biāo) + 5 panelCons.setConstraint( SpringLayout.EAST, Spring.sum( textFieldCons.getConstraint(SpringLayout.EAST), Spring.constant(5) ) ); // 計(jì)算出 按鈕 和 文本框 的 南邊坐標(biāo) 的 值較大者 Spring maxHeightSpring = Spring.max( btnCons.getConstraint(SpringLayout.SOUTH), textFieldCons.getConstraint(SpringLayout.SOUTH) ); // 設(shè)置容器的 南邊坐標(biāo) 為 maxHeightSpring + 5 panelCons.setConstraint( SpringLayout.SOUTH, Spring.sum( maxHeightSpring, Spring.constant(5) ) ); // 顯示窗口 jf.setVisible(true); } }
結(jié)果展示:
SpringLayout 更詳細(xì)具體的介紹和使用方式,詳見(jiàn) Java 官方文檔: How to Use SpringLayout
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java GUI編程之布局控制器(Layout)實(shí)例分析
- JavaSwing BorderLayout 邊界布局的實(shí)現(xiàn)代碼
- Java Swing CardLayout卡片布局的實(shí)現(xiàn)示例
- Java Swing GroupLayout分組布局的實(shí)現(xiàn)代碼
- Java Swing BoxLayout箱式布局的實(shí)現(xiàn)代碼
- Java Swing GridBagLayout網(wǎng)格袋布局的實(shí)現(xiàn)
- JavaSwing GridLayout 網(wǎng)格布局的實(shí)現(xiàn)代碼
- JavaSwing FlowLayout 流式布局的實(shí)現(xiàn)
- java布局管理之CardLayout簡(jiǎn)單實(shí)例
- Java Swing組件BoxLayout布局用法示例
- Java Swing組件布局管理器之FlowLayout(流式布局)入門(mén)教程
- java Swing布局管理之BoxLayout布局
- Java 最重要布局管理器GridBagLayout的使用方法
- JavaSwing基礎(chǔ)之Layout布局相關(guān)知識(shí)詳解
相關(guān)文章
Java 策略模式與模板方法模式相關(guān)總結(jié)
這篇文章主要介紹了Java 策略模式與模板方法模式相關(guān)總結(jié),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2021-01-01詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)
很多人在使用MyBatis的緩存后經(jīng)常會(huì)遇到MySQL分頁(yè)查詢的顯示問(wèn)題,針對(duì)于此,這里我們就來(lái)詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn),首先來(lái)回顧一下MyBatis的緩存機(jī)制與執(zhí)行:2016-06-06JAVA 根據(jù)Url把多文件打包成ZIP下載實(shí)例
這篇文章主要介紹了JAVA 根據(jù)Url把多文件打包成ZIP下載的相關(guān)資料,需要的朋友可以參考下2017-08-08Java 1,2,3,4能組成多少個(gè)互不相同且無(wú)重復(fù)數(shù)字的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java 1,2,3,4能組成多少個(gè)互不相同且無(wú)重復(fù)數(shù)字的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-02-02Java重寫(xiě)(Override)與重載(Overload)區(qū)別原理解析
這篇文章主要介紹了Java重寫(xiě)(Override)與重載(Overload)區(qū)別原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02