GroupLayout是以组为单位来管理布局的,把多个组件划分到不容的组,再根据各个组相对于水平轴和垂直轴的排列方式来进行组的管理。
import java.awt.Container;
import java.awt.HeadlessException;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class GroupLayoutDemo extends JFrame
{
private static final long serialVersionUID = 1L;
public GroupLayoutDemo() throws HeadlessException
{
Container c = getContentPane();//创建一个中间容器,并且创建一个GroupLayout布局管理器对象
GroupLayout layout = new GroupLayout(c);
JButton b1 = new JButton("按钮 1");//创建两个普通按钮组件、文本框组件
JButton b2 = new JButton("按钮 2");
JTextField text = new JTextField("文本");
GroupLayout.SequentialGroup hsg = layout.createSequentialGroup();//创建一个hsg组,将两个按钮一个一个的添加到组里面
hsg.addComponent(b1);
hsg.addComponent(b2);
GroupLayout.ParallelGroup hpg =
layout.createParallelGroup(GroupLayout.Alignment.CENTER); //创建一个hpg组,将文本框组件和上面的那个组添加到其中,并且居中排列
hpg.addComponent(text).addGroup(hsg);
layout.setHorizontalGroup(hpg); //沿水平线来确定hpg组中两个按钮组件的位置
GroupLayout.ParallelGroup vpg = layout.createParallelGroup();//创建一个vpg组,按照水平线来排列两个按钮组件的位置
vpg.addComponent(b1);
vpg.addComponent(b2);
GroupLayout.SequentialGroup vsg = layout.createSequentialGroup();// 将文本框组件和前面的容纳两个按钮组件的组同时添加到vsg组中
vsg.addComponent(text).addGroup(vpg);
layout.setVerticalGroup(vsg); //沿垂直线来确定vsg中vpg和文本框组件的位置
this.setLayout(layout);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
}
public static void main(String[] args)
{
GroupLayoutDemo demo = new GroupLayoutDemo();
demo.setVisible(true);
}
}
BoxLayout是箱式布局,它可以创建水平箱和垂直箱两种箱子
import javax.swing.*;
import java.awt.*;
public class BoxLayoutDemo
{
public static void main(String[] args)
{
BoxLayoutFrame frame1=new BoxLayoutFrame();
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setVisible(true);
}
}
class BoxLayoutFrame extends JFrame
{
private static final int WIDTH=300;
private static final int HEIGHT=200;
public BoxLayoutFrame()
{
setTitle("测试箱式布局管理器");//设置顶层容器名称、大小
setSize(WIDTH,HEIGHT);
Container con=getContentPane();//创建一个中间容器
JLabel label1=new JLabel(" 姓名:");//创建标签组件、文本框组件
JTextField textField1=new JTextField(10);
textField1.setMaximumSize(textField1.getPreferredSize());
Box hbox1=Box.createHorizontalBox();//创建一个水平箱子
hbox1.add(label1); //在水平箱子上添加一个标签组件,并且创建一个不可见的、20个单位的组件。在这之后再添加一个文本框组件
hbox1.add(Box.createHorizontalStrut(20));
hbox1.add(textField1);
JLabel label2=new JLabel(" 密码:");//创建标签组件、文本框组件
JTextField textField2=new JTextField(10);
textField2.setMaximumSize(textField2.getPreferredSize());
Box hbox2=Box.createHorizontalBox();//创建一个水平箱子
hbox2.add(label2); //在水平箱子上添加一个标签组件,并且创建一个不可见的、20个单位的组件。在这之后再添加一个文本框组件
hbox2.add(Box.createHorizontalStrut(20));
hbox2.add(textField2);
JButton button1=new JButton("确定");//创建两个普通按钮组件,并且创建一个水平箱子,将两个按钮添加到箱子中
JButton button2=new JButton("取消");
Box hbox3=Box.createHorizontalBox();
hbox3.add(button1);
hbox3.add(button2);
Box vbox=Box.createVerticalBox();//创建一个垂直箱子,这个箱子将两个水平箱子添加到其中,创建一个横向 glue 组件。
vbox.add(hbox1);
vbox.add(hbox2);
vbox.add(Box.createVerticalGlue());
vbox.add(hbox3);
con.add(vbox,BorderLayout.CENTER); // 将垂直箱子添加到BorderLayout布局管理器中的中间位置
}
}
CardLayout将容器中的每一个组件当做一个卡片,每次仅有一个卡片可见,卡片之间可以来回切换
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class CardLayoutDemo extends JFrame
{
private JPanel pane = null; // 主要的JPanel,该JPanel的布局管理将被设置成CardLayout
private JPanel p = null; // 放按钮的JPanel
private CardLayout card = null; // CardLayout布局管理器
private JButton button_1 = null; // 上一步
private JButton button_2 = null; // 下一步
private JButton b_1 = null, b_2 = null, b_3 = null; // 三个可直接翻转到JPanel组件的按钮
private JPanel p_1 = null, p_2 = null, p_3 = null; // 要切换的三个JPanel
public CardLayoutDemo ()
{
super("CardLayout Test");
try {
// 将LookAndFeel设置成Windows样式
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}
catch (Exception ex)
{
ex.printStackTrace();
}
card = new CardLayout(5, 5); //创建一个具有指定的水平和垂直间隙的新卡片布局
pane = new JPanel(card); // JPanel的布局管理将被设置成CardLayout
p = new JPanel(); // 构造放按钮的JPanel
button_1 = new JButton("< 上一步");
button_2 = new JButton("下一步 >");
b_1 = new JButton("1");
b_2 = new JButton("2");
b_3 = new JButton("3");
b_1.setMargin(new Insets(2,2,2,2));
b_2.setMargin(new Insets(2,2,2,2));
b_3.setMargin(new Insets(2,2,2,2));
p.add(button_1);
p.add(b_1);
p.add(b_2);
p.add(b_3);
p.add(button_2);
p_1 = new JPanel();
p_2 = new JPanel();
p_3 = new JPanel();
p_1.setBackground(Color.RED);
p_2.setBackground(Color.BLUE);
p_3.setBackground(Color.GREEN);
p_1.add(new JLabel("JPanel_1"));
p_2.add(new JLabel("JPanel_2"));
p_3.add(new JLabel("JPanel_3"));
pane.add(p_1, "p1");
pane.add(p_2, "p2");
pane.add(p_3, "p3");
//下面是翻转到卡片布局的某个组件的动作事件处理,当单击某个普通按钮组件,就会触发出现下一个组件
button_1.addActionListener(new ActionListener()
{
/// 上一步的按钮动作
public void actionPerformed(ActionEvent e) {
card.previous(pane);
}
});
button_2.addActionListener(new ActionListener()
{
// 下一步的按钮动作
public void actionPerformed(ActionEvent e) {
card.next(pane);
}
});
b_1.addActionListener(new ActionListener()
{
// 直接翻转到p_1
public void actionPerformed(ActionEvent e) {
card.show(pane, "p1");
}
});
b_2.addActionListener(new ActionListener()
{
// 直接翻转到p_2
public void actionPerformed(ActionEvent e) {
card.show(pane, "p2");
}
});
b_3.addActionListener(new ActionListener()
{
// 直接翻转到p_3
public void actionPerformed(ActionEvent e) {
card.show(pane, "p3");
}
});
this.getContentPane().add(pane);
this.getContentPane().add(p, BorderLayout.SOUTH);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300, 200);
this.setVisible(true);
}
public static void main(String[] args) {
new CardLayoutDemo ();
}
}
GridLayout将整个空间划分成若干行乘若干列的网络区域,组件就放于这些小区域内。
import javax.swing.*;
import java.awt.*;
public class GridLayoutDemo1
{
static final int WIDTH=300;
static final int HEIGHT=200;
public static void main(String[] args)
{
JFrame jf=new JFrame("测试程序");
jf.setSize(WIDTH,HEIGHT);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
JPanel contentPane=new JPanel();
jf.setContentPane(contentPane);
JButton b1=new JButton("港币");
JButton b2=new JButton("人民币");
JButton b3=new JButton("美元");
JButton b4=new JButton("欧元");
JButton b5=new JButton("英镑");
JButton b6=new JButton("主板");
JButton b7=new JButton("内存");
JButton b8=new JButton("硬盘");
JButton b9=new JButton("显示器");
GridLayout gird=new GridLayout(3,3); //创建一个 GridLayout布局管理器对象,将之行数设为3,列数设为3,并且将之作为中间容器的布局管理器
contentPane.setLayout(gird);
contentPane.add(b1); //将九个普通按钮组件一一添加到中间容器中
contentPane.add(b2);
contentPane.add(b3);
contentPane.add(b4);
contentPane.add(b5);
contentPane.add(b6);
contentPane.add(b7);
contentPane.add(b8);
contentPane.add(b9);
jf.pack();
}
}
FlowLayout按照组件加入的先后顺序从左到右排列,一行徘满了,再换下一行,然后继续从左到右排列,每一行的组件都是居中排列的。
import javax.swing.*;
import java.awt.*;
public class FlowLayoutDemo1
{
static final int WIDTH=300;
static final int HEIGHT=200;
public static void main(String[] args)
{
JFrame jf=new JFrame("测试程序");
jf.setSize(WIDTH,HEIGHT);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
JPanel contentPane=new JPanel();
jf.setContentPane(contentPane);
JButton b1=new JButton("港币");
JButton b2=new JButton("人民币");
JButton b3=new JButton("美元");
JButton b4=new JButton("欧元");
JButton b5=new JButton("英镑");
contentPane.setLayout(new FlowLayout());//将中间容器的布局管理器设置为FlowLayout
contentPane.add(b1); //将五个按钮分别按照FlowLayout布局管理器方式添加到中间容器中
contentPane.add(b2);
contentPane.add(b3);
contentPane.add(b4);
contentPane.add(b5);
jf.pack();
}
}