一.常用容器
面板JPanel
(默认布局方式为FlowLayout
)是一个容器,之前学的窗口JFrame
也是容器
然而JPanel
更像一个中间容器
在一个窗口中,不同的容器有不同的布局
方便管理
注:add(new JScrollPane(textArea));
可以使这个文本框带滚动条
二.布局器
布局器是在awt
包里面的
1.FlowLayout()
import java.awt.*;
import javax.swing.*;
//定义带有按钮的Frame
class myFlowLayoutFrame extends JFrame
{
private int buttons;
public myFlowLayoutFrame(int buttonNumber)
{
buttons = buttonNumber; // 设置按钮数量
setTitle("FlowLayout布局的窗体");
setSize(320,240);
Panel buttonPanel = new Panel();
setDefaultCloseOperation(EXIT_ON_CLOSE);
//增加相应的按钮
for(int i=0;i<buttons;i++)
{
Button addButton=new Button("按钮"+(i+1));
buttonPanel.add(addButton);
}
//Panel的默认布局管理器是FlowLayout,此处修改参数
//FlowLayout(对齐方式,横向间隙,纵向间隙)
buttonPanel.setLayout(new FlowLayout(1,10,80)); // 0左对齐,1居中,2右对齐
//Frame的默认布局管理器为BorderLayout
this.add(buttonPanel);
}
}
public class test
{
public static void main(String[] args)
{
//显示的按钮数目
int buttonNumber=18;
myFlowLayoutFrame frm = new myFlowLayoutFrame(buttonNumber);
frm.setVisible(true);
}
}
2.BorderLayout
//BorderLayout之例
import javax.swing.*;
import java.awt.*;
class myBorderLayoutFrame extends JFrame
{
public myBorderLayoutFrame()
{
super("BorderLayout布局的窗口");
Panel myPanel = new Panel();
myPanel.setLayout(new BorderLayout());
JButton north=new JButton("北面");
JButton south=new JButton("南面");
JButton east=new JButton("东面");
JButton west=new JButton("西面");
JButton center=new JButton("中心");
myPanel.add(north, BorderLayout.NORTH); //显示上按钮
myPanel.add(south, BorderLayout.SOUTH);
myPanel.add(east, BorderLayout.EAST); //显示东按钮
myPanel.add(west, BorderLayout.WEST);
myPanel.add(center, BorderLayout.CENTER);//显示中心按钮
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.add(myPanel);
this.setSize(320,240);
this.setVisible(true);
}
}
public class test
{
public static void main(String args[])
{
myBorderLayoutFrame frm = new myBorderLayoutFrame();
}
}
3.CardLayout
//CardLayout之例
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class myCardLayoutFrame extends JFrame
implements ActionListener
{
CardLayout mycard;
JButton buttonFirst,buttonLast,buttonNext;
Panel pCenter;
myCardLayoutFrame() //构造函数
{
setTitle("CardLayout布局的窗体");
mycard = new CardLayout();
pCenter = new Panel(); // 中间的容器
pCenter.setLayout(mycard);//设置CardLayout布局
buttonFirst = new JButton("第一个");
buttonLast = new JButton("末一个");
buttonNext = new JButton("下一个");
for(int i=1;i<=20;i++)
{
pCenter.add(new JButton("我是第 "+i+" 个按钮")); // 这些按钮必须被存在一个面板容器中
}
//给按钮添加事件监听器
buttonFirst.addActionListener(this);
buttonLast.addActionListener(this);
buttonNext.addActionListener(this);
//添加带有按钮的panel
Panel pSouth = new Panel(); // 下面的容器
pSouth.add(buttonFirst);
pSouth.add(buttonNext);
pSouth.add(buttonLast);
add(pCenter, BorderLayout.CENTER);
add(pSouth, BorderLayout.SOUTH);
setBounds(0,0,320,240);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
//按钮事件处理
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == buttonFirst)
{
mycard.first(pCenter); // 必须要有参数,确定这个first是哪个容器的
}
else if(e.getSource() == buttonNext)
{
mycard.next(pCenter);
}
else if(e.getSource() == buttonLast)
{
mycard.last(pCenter);
}
}
}
public class test{
public static void main(String args[])
{
myCardLayoutFrame frm = new myCardLayoutFrame();
}
}
4.GridLayout
//GridLayoutTest.java
import java.awt.*;
import javax.swing.*;
class myGridLayoutFrame extends JFrame
{
JButton[] buttons = new JButton[20];
public myGridLayoutFrame()
{
super("GridLayout布局的窗体");
setSize(320,240);
setLayout(new GridLayout(4,5)); // 4行5列
for(int i=0;i<buttons.length;i++)
{
buttons[i] = new JButton(""+ (i+1) ); // 只输入i+1不能识别为字符串标号,所以利用一个小技巧将int转为string
add(buttons[i]);
}
}
}
public class test
{
public static void main(String args[])
{
myGridLayoutFrame frm = new myGridLayoutFrame();
frm.show();
}
}
5.GirdBagLayout
//GridBagLayout之例
import java.awt.*;
import javax.swing.*;
class myGridBagFrame extends JFrame
{
public myGridBagFrame()
{
super("GridBagLayout布局的窗体");
Panel panel1 = new Panel();
setSize(500,500);
panel1.setLayout(new GridBagLayout());
GridBagConstraints gbdc = new GridBagConstraints();
gbdc.fill=GridBagConstraints.BOTH; //向两面扩张
gbdc.weightx=1; //设置行(weightx)的量
gbdc.weighty=1;
gbdc.gridwidth=2; //添加进入的部件就会变成为2个单元格的宽度。
gbdc.gridx=0; //另起一行,从x = 0的单元格开始填充。
panel1.add(new JButton("No.1"), gbdc);
gbdc.gridx=2; //从x = 2的单元格开始填充。
gbdc.gridwidth=1;
gbdc.gridheight=2;
panel1.add(new JButton("No.2"), gbdc);
gbdc.gridx=0; //
gbdc.gridheight=1;
panel1.add(new JButton("No.3"), gbdc);
gbdc.gridx=1;
panel1.add(new JButton("No.4"), gbdc);
gbdc.gridx = 3;
gbdc.gridwidth = 1;
gbdc.gridheight = 1;
panel1.add(new JButton("No.5"), gbdc);
//gbdc.gridx = 0; // 每当gbdc.gridx重新设定为0时,就代表新建了一行
//gbdc.gridwidth = 1;
//gbdc.gridheight = 1;
//panel1.add(new JButton("No.6"), gbdc);
add(panel1);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
public class test
{
public static void main(String args[])
{
myGridBagFrame frm= new myGridBagFrame();
frm.setVisible(true);
}
}
weightx,weighty:用来设置窗口变大时,各组件跟着变大的比例,当数字越大,表示组件能得到更多的空间,默认值皆为0。
这个我还是不知道有什么用,设置为0的话就是按钮原大小,其他值都是一样的效果。
这种布局器是控制每个组件的,先设设置布局器的位置大小,再设置按钮
而且这种布局是铺满整个面板的,每个组件的大小 <= 面板的大小
如果按钮5的宽设为3,显示的大小还是2,如果是1,就会空缺一部分
而且这种布局不能隔行新建,也就是不能中间空一行什么组件都不添加
如果新建一个6,再把5的宽设定为3,就能显示了