- GridBagLayout以表格形式布置容器內(nèi)的組件, 將每個(gè)組件放置在每個(gè)單元格內(nèi),而一個(gè)單元格可以跨越多個(gè)單元格合并成一個(gè)單元格,即多個(gè)單元格可以組合成一個(gè)單元格,從而實(shí)現(xiàn)組件的自由布局。
- 每一個(gè)單元格都有各自的屬性,而這些屬性由GridBagConstrainsts類(lèi)的成員變量來(lái)定義,且GridBagConstriaints中的所有成員變量都是public的。
- 構(gòu)造函數(shù):
GirdBagLayout()建立一個(gè)新的GridBagLayout管理器。
GridBagConstraints()建立一個(gè)新的GridBagConstraints對(duì)象。
GridBagConstraints(int gridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty,int anchor,int fill, Insets insets,int ipadx,int ipady)
建立一個(gè)新的GridBagConstraints對(duì)象,并指定其參數(shù)的值。 - 下面提供一個(gè)用來(lái)設(shè)置GridBagConstraints對(duì)象各參數(shù)的幫助類(lèi)
import java.awt.GridBagConstraints;
import java.awt.Insets;
/**1. 2. @author han3. 功能:用來(lái)設(shè)置GridBagConstraints對(duì)象的一些參數(shù)4. */
public class GBC extends GridBagConstraints {/*** 初始化左上角位置 gridx,gridy —— 設(shè)置組件的位置,* gridx=0,gridy=0時(shí)放在0行0列。* * @param gridx* @param gridy*/public GBC(int gridx, int gridy) {this.gridx = gridx;this.gridy = gridy;}/*** 初始化左上角位置和所占行數(shù)和列數(shù)* * gridwidth,gridheight —— 用來(lái)設(shè)置組件所占的單位長(zhǎng)度與高度,默認(rèn)值皆為1。* 可以使用GridBagConstraints.REMAINDER常量,* 代表此組件為此行或此列的最后一個(gè) 組件,而且會(huì)占據(jù)所有剩余的空間。* * @param gridx* @param gridy* @param gridwidth* @param gridheight*/public GBC(int gridx, int gridy, int gridwidth, int gridheight) {this.gridx = gridx;this.gridy = gridy;this.gridwidth = gridwidth;this.gridheight = gridheight;}/*** 對(duì)齊方式 anchor:設(shè)置組件在單元格中的對(duì)齊方式。* 由以下常量來(lái)定義* * GridBagConstraints.CENTER* * GridBagConstraints.EAST* * GridBagConstraints.WEST* * GridBagConstraints.SOUTH* * GridBagConstraints.NORTH* * GridBagConstraints.SOUTHEAST* * GrisBagConstraints.SOUTHWEST* * GridBagConstraints.NORTHEAST* * GridBagConstraints.NORTHWEST* * @param anchor* @return*/public GBC setAnchor(int anchor) {this.anchor = anchor;return this;}/*** 是否拉伸及拉伸方向* * fill:當(dāng)某個(gè)組件未能填滿(mǎn)單元格時(shí),可由此屬性設(shè)置橫向、* 縱向或雙向填滿(mǎn)。由以下常量來(lái)定義* * GridBagConstraints.NONE* * GridBagConstraints.HORIZONTAL* * GridBagConstraints.VERTICAL* * GridBagConstraints.BOTH* * @param fill* @return*/public GBC setFill(int fill) {this.fill = fill;return this;}/*** x和y方向上的增量* * weightx,weighty——用來(lái)設(shè)置窗口變大時(shí),各組件跟著變大的比例。 * 當(dāng)數(shù)字越大,表示組件能得到更多的空間,默認(rèn)值皆為0(0-1)。* * @param weightx* @param weighty* @return*/public GBC setWeight(double weightx, double weighty) {this.weightx = weightx;this.weighty = weighty;return this;}/*** 外部填充* * @param distance* @return*/public GBC setInsets(int distance) {this.insets = new Insets(distance, distance, distance, distance);return this;}/*** 外填充* * insets —— 設(shè)置組件之間彼此的間距。* 它有四個(gè)參數(shù),分別是上,左,下,右,默認(rèn)為(0,0,0,0)。* * @param top* @param left* @param bottom* @param right* @return*/public GBC setInsets(int top, int left, int bottom, int right) {this.insets = new Insets(top, left, bottom, right);return this;}/*** 內(nèi)填充* * ipadx,ipady —— 設(shè)置組件間距,默認(rèn)值為0。* * @param ipadx* @param ipady* @return*/public GBC setIpad(int ipadx, int ipady) {this.ipadx = ipadx;this.ipady = ipady;return this;}
}
- GridBagLayout布局的一個(gè)案例—->使三個(gè)帶顏色的面板一直在Frame窗口的中央顯示(無(wú)論窗口放大還是縮小)
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
/*** * @author han* * 使用GridBagLayout布局的一個(gè)案例* * 功能:使三個(gè)帶顏色的面板一直在Frame窗口的中央顯示(無(wú)論窗口放大還是縮小)* */
public class GridBagLayoutTest extends JFrame {private static final long serialVersionUID = 1391949900949468015L;private JPanel contentPane;public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {GridBagLayoutTest frame = new GridBagLayoutTest();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}public GridBagLayoutTest() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 511, 500);setTitle("GridBagLayout布局案例");contentPane = new JPanel();setContentPane(contentPane);GridBagLayout gbl_contentPane = new GridBagLayout();contentPane.setLayout(gbl_contentPane);JPanel jPanel1 = new JPanel();jPanel1.setSize(300, 100);jPanel1.setBackground(Color.blue);JPanel jPanel2 = new JPanel();jPanel2.setSize(300, 300);jPanel2.setBackground(Color.red);JPanel jPanel3 = new JPanel();jPanel3.setSize(300, 100);jPanel3.setBackground(Color.YELLOW);contentPane.add(jPanel1, new GBC(0, 1).setInsets(20, 0, 20, 0).setWeight(1, 0).setIpad(300, 100));contentPane.add(jPanel2, new GBC(0, 2).setInsets(20, 0, 20, 0).setWeight(1, 0).setIpad(300, 100));contentPane.add(jPanel3, new GBC(0, 3).setInsets(20, 0, 20, 0).setWeight(1, 0).setIpad(300, 100));}}