一、布局管理
BorderLayout FlowLayout GridLayout
GridBagLayout CardLayout BoxLayout
1、无布局
用setLayout()方法可以设置窗体的布局模式,当设置为setLayout(null)为无布局,可以通过
setSize(int width,int height)、setSize(java.awt.Dimension)、setLocation(int x, int y)、
setLocation(java.awt.Ponint)、setBounds(int x, int y, int width, int height)、setBounds(java.awt.Rectangle)
注意:设置了布局方式后,上面的方法将都会失效
2、BorderLayout(边框布局)
java.lang.Object
–java.awt.BorderLayout
将界面划分成东、西、南、北、中五个区域,将添加的组件按指定位置放置,每个区域只能放置一个组件,当界面大小发生变化时,变化规律为:组件的相对位置不变,大小发生变化,如果四周区域没有没有组件,则由center区域去补。
BorderLayout.EAST
BorderLayout.WEST
BorderLayout.SOUTH
BorderLayout.NORTH
BorderLayout.CENTER
3、FlowLayout(流式布局)
组件按从左到右而后从上到下的顺序依次排列,一行不能放完则转到下一行。
构造函数:
FlowLayout()
建立一个默认为居中对齐,组件彼此有5单位的水平与垂直间距的FlowLayout
FlowLayout(int align)
建立一个可设置排列方式且组件彼此有5单位的水平与垂直间距的FlowLayout
FlowLayout(int align,int hgap,int vgap)
建立一个可设置排列方式与组件间距的FlowLayout
4、GridLayout(网格布局)
矩形网格形式对容器的组件进行布置,将界面划分成N行,M列的网格,每个网格的大小相同,布局时,按照组件加入的顺序优先考虑行布局,当一行布满后再布局下一行(每行只能布局M个组件),只有当行列不能满足指定的数值时(N X M小于组件个数),才按照行进行扩展
构造函数:
GridLayout()
建立一个默认为一行一列的GridLayout
GridLayout(int rows,int cols)
建立一个指定行(rows)和列(cols)的GridLayout
GridLayout(int rows,int cols,int hgap,int vgap)
建立一个指定行(rows)和列(cols),且组件间水平间距为hgap、垂直间距为vgap的GridLayout
5、GridBagLayout(网格组布局)
网格组布局是所有布局管理器之母。可以将网格组布局看作没有任何限制的网格布局。在网格组布局中,行和列的尺寸都可以改变,可以将相邻的单元格合并以适应较大的组件。组件不需要填充整个单元格区域并可以指定它们在单元格内的对齐方式。
网格组布局过程:
1)建立一个GridBagLayout队形。不需要指定网格的行数和列树。布局管理器会根据后面所给的信息猜测出来。
2)将GridBagLayout对象设置成组件的布局管理器
3)为每个组件建立一个GridBagConstraints对象,设置GridBagConstraints对象的域以便指出组件在网格组中的布局方案。
4)最后通过下面的调用添加组件的约束
add(component,constraints);
相应步骤代码
GridBagLayout layout=new GridBagLayout();
Panel.setLayout(layout);
GridBagContraints constraints=new GridBagContraints();
constraints.weightx=100;
contsraints.weighty=100;
constraints.gridx=0;
constraints.gridy=2;
constraints.gridwidth=2;
constraints.gridheight=1;
panel.add(Component,constraints);
4.3、重要的约束:
i、gridx,gridy,gridwidth,gridheight参数
gridx、gridy指定了被添加组件左上角的行和列的位置
gridwidth、gridheight指定了组件占据的行数和列数
ii、增量域
在网格布局中为每个区域设置增量域(weightx,weighty)。如果将增量域设置为0,则这个区域将永远为初始尺寸,窗口缩放时,组件大小始终保持不变。如果设置的增量值不为0,缩放窗体,组件大小将跟着调整。其实,这里的增量参数属于行和列的属性,并不属于某个单独的单元格
iii、fill和anchor参数
如不希望组件拉伸至整个区域,就需要设置fill约束,它有四个有效值:GridBagConstraints.NONE、GridBagConstraints.HORIZONTAL、GridBagConstraints.VERTICAL、GridBagConstraints.BOTH
如果组件没有填充整个区域,可以设置anchor域指定其位置。有效值为GridBagConstraints.CENTER(默认值)、GridBagConstraints.NORTH、GridBagConstraints.NORTHEAST、GridBagConstraints.EAST.
iv.填充
1)外部填充(external padding)
设置Insets对象的left、top、right、bottom指定组件周围的空间量,在组件周围增加附加空白区域。
2)内部填充(internal padding)
通过设置ipadx和ipady指定内部填充,这两个值被加到组件的最小宽度和最小高度上,这样可以保证组件不会收缩至最小尺寸之下。
4.4、指定gridx,gridy,gridwidth和gridheight参数的另一种方法
4.5、使用帮助类来管理网格组约束
编写函数或帮助类来设置网格约束代码,使用帮助类,有以下特性:
1)名字简短:GBC代替GridBagConstraints
2)扩展于GridBagConstraints,因此可以使用约束的缩写,如GBC.EAST
3)有两个构造器可以用来设置最常用的参数:gridx和gridy,或者gridx、gridy、gridwidth、gridheight
add(component,new GBC(1,2,1,4));
4)域有很便捷的设置方法,采用x/y值对形式
add(component,newGBC(1,2).setWeight(100,100);
5)设置方法将返回this,所以可以链接它们:
add(component,new GBC(1,2).setAnchor(GBC.EAST).setWeight(100,100);
setInsets方法将构造Inset对象,要想获取1个像素的insets,可以调用:
add(components,new GBC(1,2).setAnchor(GBC.EAST).setInsets(1));
例:用GridBagLayout布局案例
//便捷帮助类GBC
package gridbaglayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
public class GBC extends GridBagConstraints{
//设置组件被添加的左上角的行和列
public GBC(int gridx,int gridy) {
this.gridx=gridx;
this.gridy=gridy;
}
//设置组件被添加位置的左上角的行、列和组件所占据的行数和列数
public GBC(int gridx,int gridy,int gridwidth,int gridheight) {
this.gridx=gridx;
this.gridy=gridy;
this.gridwidth=gridwidth;
this.gridheight=gridheight;
}
//设置组件的增量域
public GBC setWeight(double weightx,double weighty) {
this.weightx=weightx;
this.weighty=weighty;
return this;
}
//
public GBC setFill(int fill) {
this.fill=fill;
return this;
}
public GBC setAnchor(int anchor) {
this.anchor=anchor;
return this;
}
public GBC setInsets(int distance) {
this.insets=new Insets(distance,distance,distance,distance);
return this;
}
public GBC setInsets(int top,int left,int bottom,int right) {
this.insets=new Insets(top,left,bottom,right);
return this;
}
public GBC setIpad(int ipadx,int ipady) {
this.ipadx=ipadx;
this.ipady=ipady;
return this;
}
}
//窗体布局设置
package gridbaglayout;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
public class FontFrame extends JFrame{
public static final int Text_ROWS=10;
public static final int TEXT_COLUMNS=20;
private JComboBox<String> face;
private JComboBox<Integer> size;
private JCheckBox bold;
private JCheckBox italic;
private JTextArea sample;
public FontFrame() {
GridBagLayout layout=new GridBagLayout();
setLayout(layout);
ActionListener listener=event->updateSample();
JLabel faceLabel=new JLabel("Face:");
face=new JComboBox<>(new String[] {
"Serif","SansSerif","Monospaced","Dialog","DialogInput"
});
face.addActionListener(listener);
JLabel sizeLabel=new JLabel("Size:");
size=new JComboBox<>(new Integer[] {
8,10,12,15,18,24,36,48
});
size.addActionListener(listener);
bold=new JCheckBox("Bold");
bold.addActionListener(listener);
italic=new JCheckBox("italic");
italic.addActionListener(listener);
sample=new JTextArea(Text_ROWS,TEXT_COLUMNS);
sample.setText("The quick brown fox jumps over the lazy dog");
sample.setEditable(true);
sample.setLineWrap(true);
sample.setBorder(BorderFactory.createEmptyBorder());
add(faceLabel,new GBC(0,0).setAnchor(GBC.EAST));
add(face,new GBC(1,0).setFill(GBC.HORIZONTAL).setWeight(100, 0).setInsets(1));
add(sizeLabel,new GBC(0,1).setAnchor(GBC.EAST));
add(size,new GBC(1,1).setFill(GBC.HORIZONTAL).setWeight(100, 0).setInsets(1));
add(bold,new GBC(0,2,2,1).setAnchor(GBC.CENTER).setWeight(100, 100));
add(italic,new GBC(0,3,2,1).setAnchor(GBC.CENTER).setWeight(100, 100));
add(sample,new GBC(3,0,1,4).setFill(GBC.BOTH).setWeight(100, 100));
pack();
updateSample();
}
public void updateSample() {
String fontFace=(String) face.getSelectedItem();
int fontStyle=(bold.isSelected() ? Font.BOLD : 0)+(italic.isSelected() ? Font.ITALIC : 0);
int fontSize=size.getItemAt(size.getSelectedIndex());
Font font=new Font(fontFace,fontStyle,fontSize);
sample.setFont(font);
sample.repaint();
}
}
//测试:
package gridbaglayout;
import javax.swing.JFrame;
public class Test {
public static void main(String[] args) {
JFrame frame=new FontFrame();
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
效果图如下: