Java Swing GridBagLayout網(wǎng)格袋布局的實現(xiàn)
1. 布局: GridBagLayout
官方JavaDocsApi: java.awt.GridBagLayout
GridBagLayout,網(wǎng)格袋布局管理器。它不要求組件的大小相同便可以將組件垂直、水平或沿它們的基線對齊。每個 GridBagLayout 對象維持一個動態(tài)的矩形單元格(動態(tài)計算出單個單元格的大?。總€組件占用一個或多個的單元格,該單元格被稱為 顯示區(qū)域。每個組件顯示區(qū)域按 從左到右,從上到下,依次排列。
2. 約束: GridBagConstraints
GridBagConstraints,封裝了若干對組件的約束屬性,每個由 GridBagLayout 管理的 組件都關聯(lián)一個該約束實例,以指定 組件所在顯示區(qū)域 的具體放置位置,以及 組件在其顯示區(qū)域中 的對齊方式。
給組件添加約束: GridBagLayout.setConstraints(Component comp, GridBagConstraints c)
PS: 要理解 組件(所在)顯示區(qū)域(一個或多個單元格組成) 和 組件在其顯示區(qū)域中的對齊方式 這兩個不同的概念。
3. 屬性: GridBagConstraints 的屬性
下面屬性描述中的相關大寫字母常量均定義在GridBagConstraints類中。
3.1 顯示區(qū)域 約束屬性
組件的顯示區(qū)域相關約束屬性,直接作用在組件所在顯示區(qū)域上。
(1)gridx, gridy
組件顯示區(qū)域 開始顯示的位置(單元格坐標),容器左上角第一個單元格位置為 (0, 0),默認值為RELATIVE,表示放置在 “上一個組件”(所在行列最后添加的一個組件)的 “后面”。
(2)gridwidth, gridheight
組件顯示區(qū)域 水平/豎直方向 所占單元格的個數(shù),默認值為 1,如要占多行/列,需整體結果有足夠的行/列。有如下兩個常量特殊值可選:
- REMAINDER: 占完所在行/列余下所有單元格(該值可實現(xiàn) 換行 作用);
- RELATIVE: 占到所在行/列余下的倒數(shù)第二個單元格(使用該值,所在行/列的最后一個單元格需要“合理”安排組件,并手動換行)。
設置該值不能導致 “前面” 或 “后面” 單元格有留空白,否則可能無效。
(3)weightx, weighty
如何 分布額外空間(單元格區(qū)域外,容器邊緣內 的間隔),當指定行/列中的其中 任意一個 組件的權重(大于0),則該行/列將(和其他行/列按權重比例)分配額外的水平/豎直空間。當權重為 0(默認值)時,則 整個單元格區(qū)域 居中于容器中心。
PS: 如果調用了java.awt.Window.pack()方法,該值無效,因為 pack 后已無額外的空間。
3.2 組件 約束屬性
組件相關約束屬性,直接作用在組件上。
(1)fill
當 顯示區(qū)域 大小大于 組件 所需要的大小時,組件 在其 顯示區(qū)域內 的填充方式??赡艿闹等缦?
- NONE: (默認)不調整組件大??;
- HORIZONTAL: 加寬組件,使它在水平方向上填滿其顯示區(qū)域,但是不改變高度;
- VERTICAL: 加高組件,使它在垂直方向上填滿其顯示區(qū)域,但是不改變寬度;
- BOTH: 使組件完全填滿其顯示區(qū)域。
(2)anchor
組件 在 顯示區(qū)域內 的位置(對齊方式),可能有如下三種值:
絕對值 | 相對于方向的值 | 相對于基線的值 |
---|---|---|
NORTH | PAGE_START | BASELINE |
SOUTH | PAGE_END | BASELINE_LEADING |
WEST | LINE_START | BASELINE_TRAILING |
EAST | LINE_END | ABOVE_BASELINE |
NORTHWEST | FIRST_LINE_START | ABOVE_BASELINE_LEADING |
NORTHEAST | FIRST_LINE_END | ABOVE_BASELINE_TRAILING |
SOUTHWEST | LAST_LINE_START | BELOW_BASELINE |
SOUTHEAST | LAST_LINE_END | BELOW_BASELINE_LEADING |
CENTER(默認值) | BELOW_BASELINE_TRAILING |
(3)ipadx, ipady
組件的內部填充(可看做是 組件的內邊距),即對組件最小大小的添加量。組件的寬度至少為其最小寬度/高度加上 ipadx/ipady 像素。
(4)insets
組件的外部填充(可看做是 組件的外邊距,也可看做是 顯示區(qū)域 的內邊距),即 組件 與其 顯示區(qū)域邊緣 之間間距的最小量。
PS: 上面各屬性值之間,以及其他因素,有可能存在沖突或不兼容,不一定設置了即有效,建議多做實驗,多寫測試Demo去嘗試。
4. 案例: GridBagLayout使用實例
先展示效果,如下圖所示:
各按鈕約束參數(shù):
- Button01, Button02, Button03:默認
- Button04:gridwidth = REMAINDER、fill = BOTH
- Button05:gridwidth = REMAINDER、fill = BOTH
- Button06:gridwidth = RELATIVE、fill = BOTH
- Button07:gridwidth = REMAINDER
- Button08:gridheight = 2、fill = BOTH
- Button09:gridwidth = REMAINDER、fill = BOTH
- Button10:gridwidth = REMAINDER、fill = BOTH
代碼實現(xiàn):
package com.xiets.swing; import javax.swing.*; import java.awt.*; public class Main { public static void main(String[] args) { JFrame jf = new JFrame("測試窗口"); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); GridBagLayout gridBag = new GridBagLayout(); // 布局管理器 GridBagConstraints c = null; // 約束 JPanel panel = new JPanel(gridBag); JButton btn01 = new JButton("Button01"); JButton btn02 = new JButton("Button02"); JButton btn03 = new JButton("Button03"); JButton btn04 = new JButton("Button04"); JButton btn05 = new JButton("Button05"); JButton btn06 = new JButton("Button06"); JButton btn07 = new JButton("Button07"); JButton btn08 = new JButton("Button08"); JButton btn09 = new JButton("Button09"); JButton btn10 = new JButton("Button10"); /* 添加 組件 和 約束 到 布局管理器 */ // Button01 c = new GridBagConstraints(); gridBag.addLayoutComponent(btn01, c); // 內部使用的僅是 c 的副本 // Button02 c = new GridBagConstraints(); gridBag.addLayoutComponent(btn02, c); // Button03 c = new GridBagConstraints(); gridBag.addLayoutComponent(btn03, c); // Button04 顯示區(qū)域占滿當前行剩余空間(換行),組件填充顯示區(qū)域 c = new GridBagConstraints(); c.gridwidth = GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.BOTH; gridBag.addLayoutComponent(btn04, c); // Button05 顯示區(qū)域獨占一行(換行),組件填充顯示區(qū)域 c = new GridBagConstraints(); c.gridwidth = GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.BOTH; gridBag.addLayoutComponent(btn05, c); // Button06 顯示區(qū)域占到當前尾倒車第二個單元格(下一個組件后需要手動換行),組件填充顯示區(qū)域 c = new GridBagConstraints(); c.gridwidth = GridBagConstraints.RELATIVE; c.fill = GridBagConstraints.BOTH; gridBag.addLayoutComponent(btn06, c); // Button07 放置在當前行最后一個單元格(換行) c = new GridBagConstraints(); c.gridwidth = GridBagConstraints.REMAINDER; gridBag.addLayoutComponent(btn07, c); // Button08 顯示區(qū)域占兩列,組件填充顯示區(qū)域 c = new GridBagConstraints(); c.gridheight = 2; c.fill = GridBagConstraints.BOTH; gridBag.addLayoutComponent(btn08, c); // Button09 顯示區(qū)域占滿當前行剩余空間(換行),組件填充顯示區(qū)域 c = new GridBagConstraints(); c.gridwidth = GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.BOTH; gridBag.addLayoutComponent(btn09, c); // Button10 顯示區(qū)域占滿當前行剩余空間(換行),組件填充顯示區(qū)域 c = new GridBagConstraints(); c.gridwidth = GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.BOTH; gridBag.addLayoutComponent(btn10, c); /* 添加 組件 到 內容面板 */ panel.add(btn01); panel.add(btn02); panel.add(btn03); panel.add(btn04); panel.add(btn05); panel.add(btn06); panel.add(btn07); panel.add(btn08); panel.add(btn09); panel.add(btn10); jf.setContentPane(panel); jf.pack(); jf.setLocationRelativeTo(null); jf.setVisible(true); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- java GUI編程之布局控制器(Layout)實例分析
- Java Swing SpringLayout彈性布局的實現(xiàn)代碼
- JavaSwing BorderLayout 邊界布局的實現(xiàn)代碼
- Java Swing CardLayout卡片布局的實現(xiàn)示例
- Java Swing GroupLayout分組布局的實現(xiàn)代碼
- Java Swing BoxLayout箱式布局的實現(xiàn)代碼
- JavaSwing GridLayout 網(wǎng)格布局的實現(xiàn)代碼
- JavaSwing FlowLayout 流式布局的實現(xiàn)
- java布局管理之CardLayout簡單實例
- Java Swing組件BoxLayout布局用法示例
- Java Swing組件布局管理器之FlowLayout(流式布局)入門教程
- java Swing布局管理之BoxLayout布局
- Java 最重要布局管理器GridBagLayout的使用方法
- JavaSwing基礎之Layout布局相關知識詳解
相關文章
mybatisPlus如何使用MetaObjectHandler對字段進行更新
這篇文章主要介紹了mybatisPlus如何使用MetaObjectHandler對字段進行更新問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04Springboot+redis+Interceptor+自定義annotation實現(xiàn)接口自動冪等
本篇文章給大家介紹了使用springboot和攔截器、redis來優(yōu)雅的實現(xiàn)接口冪等,對于冪等在實際的開發(fā)過程中是十分重要的,因為一個接口可能會被無數(shù)的客戶端調用,如何保證其不影響后臺的業(yè)務處理,如何保證其只影響數(shù)據(jù)一次是非常重要的,感興趣的朋友跟隨小編一起看看吧2019-07-07java實現(xiàn)批量下載 多文件打包成zip格式下載
這篇文章主要為大家詳細介紹了java實現(xiàn)批量下載、將多文件打包成zip格式下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07