试着用用你会发现其实GridBagLayout真的能解决几乎所有界面布局的问题,窗口大小的随意改变也不会影响到整体布局,更重要的是它可以实现任何你想要的布局设计,只要你做到更有计划和更有耐心一点就行了。对于简单的程序使用Boborderlayout和Gridlayout就绰绰有余了, 但如果要把程序提到实际应用上你就得考虑使用GridBagLayout。当然, 做复杂的应用程序时,一开始就使用GridBagLayout就会更有效率。一旦你决定使用GridBagLayout,接下来一步便是要找一些纸和铅笔,只有你准确知道你的界面看上去需要成什么样子,你就可以敲键盘。这就是说,你应该在编码之前进行妥善规划。
GridBagLayout从它的名字中你也可以猜到,它同GridLayout一样,在容器中以网格形式来管理组件.但GridBagLayout功能要来得强大得多.
1、GridBagLayout管理的所有行和列都可以是大小不同的.
2、GridLayout把每个组件限制到一个单元格,而GridBagLayout并不这样:组件在容器中可以占据任意大小的矩形区域,GridBagLayout通常由一个专用类来对他布局行为进行约束,该类叫GridBagConstraints.其中的所有成员都是public的, 因此要学好如何使用GridBagLayout首先要了解有那些约束变量,以及如何设置这些约束变量.以下是GridBagConstraints的公有成员变量:
构造函数:
GirdBagLayout()建立一个新的GridBagLayout管理器。
GridBagConstraints()建立一个新的GridBagConstraints对象。
GridBagConstraints(int gridx,int gridy,
int gridwidth,int gridheight,
double weightx,double weighty,
int anchor,int fill, Insets insets,
int ipadx,int ipady)建立一个新的GridBagConstraints对象,并指定其参数的值。
参数说明:
gridx,gridy —— 设置组件的位置,
gridx设置为GridBagConstraints.RELATIVE代表此组件位于之前所加入组件的右边。
gridy设置为GridBagConstraints.RELATIVE代表此组件位于以前所加入组件的下面。
建议定义出gridx,gridy的位置以便以后维护程序。gridx=0,gridy=0时放在0行0列。
gridwidth,gridheight —— 用来设置组件所占的单位长度与高度,默认值皆为1。
你可以使用GridBagConstraints.REMAINDER常量,代表此组件为此行或此列的最后一个组件,而且会占据所有剩余的空间。
weightx,weighty —— 用来设置窗口变大时,各组件跟着变大的比例。
当数字越大,表示组件能得到更多的空间,默认值皆为0。
anchor —— 当组件空间大于组件本身时,要将组件置于何处。
有CENTER(默认值)、NORTH、NORTHEAST、EAST、SOUTHEAST、WEST、NORTHWEST选择。
insets —— 设置组件之间彼此的间距。
它有四个参数,分别是上,左,下,右,默认为(0,0,0,0)。
ipadx,ipady —— 设置组件间距,默认值为0。
你应该能看到在草图里有一些线,这些线是用来把总界面分成若干行和列的,这样你就很清楚每一个组件放置的格子位置。这就是GridBagLayout里"格"的那一部分,而图上的数字就是格的号码。
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GridBagWindow extends JFrame { private JButton searchBtn; private JComboBox modeCombo; private JLabel tagLbl; private JLabel tagModeLbl; private JLabel previewLbl; private JTable resTable; private JTextField tagTxt; public GridBagWindow() { Container contentPane = getContentPane(); GridBagLayout gridbag = new GridBagLayout(); contentPane.setLayout(gridbag); GridBagConstraints c = new GridBagConstraints(); //setting a default constraint value c.fill =GridBagConstraints.HORIZONTAL; tagLbl = new JLabel("Tags"); c.gridx = 0; //x grid position c.gridy = 0; //y grid position gridbag.setConstraints(tagLbl, c); //associate the label with a constraint object contentPane.add(tagLbl); //add it to content pane tagModeLbl = new JLabel("Tag Mode"); c.gridx = 0; c.gridy = 1; gridbag.setConstraints(tagModeLbl, c); contentPane.add(tagModeLbl); tagTxt = new JTextField("plinth"); c.gridx = 1; c.gridy = 0; c.gridwidth = 2; gridbag.setConstraints(tagTxt, c); contentPane.add(tagTxt); String[] options = {"all", "any"}; modeCombo = new JComboBox(options); c.gridx = 1; c.gridy = 1; c.gridwidth = 1; gridbag.setConstraints(modeCombo, c); contentPane.add(modeCombo); searchBtn = new JButton("Search"); c.gridx = 1; c.gridy = 2; gridbag.setConstraints(searchBtn, c); contentPane.add(searchBtn); resTable = new JTable(5,3); c.gridx = 0; c.gridy = 3; c.gridwidth = 3; gridbag.setConstraints(resTable, c); contentPane.add(resTable); previewLbl = new JLabel("Preview goes here"); c.gridx = 0; c.gridy = 4; gridbag.setConstraints(previewLbl, c); contentPane.add(previewLbl); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String args[]) { GridBagWindow window = new GridBagWindow(); window.setTitle("GridBagWindow"); window.pack(); window.setVisible(true); } }