3、窗体组件的布局
布局管理器可以有效的管理窗体上组件的界面布局,常见的布局管理器类有流布局管理器类、网格布局管理器类、边框布局管理器类等。
3、1 流布局管理器类
这种布局采用的是象书写文字一样,按照从左到右、从上到下的顺序来摆放所有窗体上的组件,如
import javax.swing.*;
import java.awt.*;
public class exec
{
public static void main(String [] args)
{
JFrame f=new JFrame("Hello!");
f.setLocation(10,100);
f.setSize(600,400);
f.getContentPane().setLayout(new FlowLayout());
JButton jb1=new JButton("Click 1");
JButton jb2=new JButton("Click 2");
JButton jb3=new JButton("Click 3");
f.getContentPane().add(jb1);
f.getContentPane().add(jb2);
f.getContentPane().add(jb3);
f.setVisible(true);
}
}
可以尝试着改变窗体的大小,观察按钮的布局。
当然,流布局管理器类也可以定义很多布局属性,从而进行必要的一些样式调整,如:
import javax.swing.*;
import java.awt.*;
public class exec
{
public static void main(String [] args)
{
JFrame f=new JFrame("Hello!");
f.setLocation(10,100);
f.setSize(600,400);
f.getContentPane().setLayout(new FlowLayout(1,10,100));
JButton jb1=new JButton("Click 1");
JButton jb2=new JButton("Click 2");
JButton jb3=new JButton("Click 3");
f.getContentPane().add(jb1);
f.getContentPane().add(jb2);
f.getContentPane().add(jb3);
f.setVisible(true);
}
}
说明:
1)流布局管理器类构造函数三个参数的意思分别为:第一参数代表对齐方式,如0表示左对齐,1表示居中,2右对齐,3顶端对齐,4底部对齐;第二参数代表水平间距;第三参数代表垂直间距。
2)可以尝试着改变窗体的大小,观察按钮的布局,特别注意,当一行显示不下而换行显示按钮时,中间的垂直间距和第一行按钮距窗体标题栏的间距都是100象素单位。但是,如果将窗体收缩太小,则可能无法显示全部组件。一个简单的解决方法是设置窗体对象的可调整属性为假,即调用setResizable()方法即可,如:
import javax.swing.*;
import java.awt.*;
public class exec
{
public static void main(String [] args)
{
JFrame f=new JFrame("Hello!");
f.setLocation(10,100);
f.setSize(600,400);
f.getContentPane().setLayout(new FlowLayout(1,10,100));
JButton jb1=new JButton("Click 1");
JButton jb2=new JButton("Click 2");
JButton jb3=new JButton("Click 3");
f.getContentPane().add(jb1);
f.getContentPane().add(jb2);
f.getContentPane().add(jb3);
f.setResizable(false);//重要
f.setVisible(true);
}
}
3)只要是容器型的组件都可以添加其他组件,也都可以设置布局管理器,所以面板就是一个常用的容器组件,综合使用面板叠加嵌套布局管理器可以构造出更加灵活的界面,如下面的练习可以显示一个计算器程序:
import javax.swing.*;
import java.awt.*;
public class exec
{
public static void main(String [] args)
{
JFrame f=new JFrame("Hello!");
f.setLocation(10,100);
f.setSize(150,400);
f.getContentPane().setLayout(new FlowLayout(1,10,10));
JLabel l=new JLabel("****计算器****");
JLabel l1=new JLabel("数1:");
JLabel l2=new JLabel("数2:");
JLabel l3=new JLabel("和:");
JTextField t1=new JTextField(5);
JTextField t2=new JTextField(5);
JTextField t3=new JTextField(10);
JButton b=new JButton("Sum");
JPanel p1=new JPanel();
JPanel p2=new JPanel();
JPanel p3=new JPanel();
JPanel p4=new JPanel();
JPanel p5=new JPanel();
p1.setLayout(new FlowLayout(FlowLayout.CENTER,0,10));
p1.add(l);
p2.setLayout(new FlowLayout(FlowLayout.CENTER,10,0));
p2.add(l1);
p2.add(t1);
p3.setLayout(new FlowLayout(FlowLayout.CENTER,10,0));
p3.add(l2);
p3.add(t2);
p4.setLayout(new FlowLayout(FlowLayout.CENTER,10,0));
p4.add(l3);
p4.add(t3);
p5.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
p5.add(b);
f.getContentPane().add(p1);
f.getContentPane().add(p2);
f.getContentPane().add(p3);
f.getContentPane().add(p4);
f.getContentPane().add(p5);
f.setVisible(true);
}
}
3、2 网格布局管理器类
这种布局将窗体屏幕划分为一个虚拟的网格,按照组件添加的次序,从左到右、从上到下向各个网格单元添加组件。和流布局管理器类不同的地方在于,组件不会因为窗体大小的变化而移位,相反,组件通过自动缩放以保持屏幕组件的网格关系。如:
import javax.swing.*;
import java.awt.*;
public class exec
{
public static void main(String [] args)
{
JFrame f=new JFrame("Hello!");
f.setLocation(10,100);
f.setSize(600,400);
f.setMinimumSize(new Dimension(200,100));
f.getContentPane().setLayout(new GridLayout(3,3,10,10));
JButton[] jb=new JButton[9];
for(int i=0;i<jb.length;i++)
{
jb=new JButton(String.valueOf(i));
f.getContentPane().add(jb);
}
f.setVisible(true);
}
}
说明:
网格布局管理器类构造函数中的四个参数中,前两个代表行数和列数,后两个代表组件的横向间距和纵向间距。
3、3 边框布局管理器类
这种布局将窗体屏幕的显示区域分为上、下、左、右、中五个部分,并且可以指定组件放置到哪个部分,如:
import javax.swing.*;
import java.awt.*;
public class exec
{
public static void main(String [] args)
{
JFrame f=new JFrame("Hello!");
f.setLocation(10,100);
f.setSize(600,400);
f.setMinimumSize(new Dimension(200,100));
f.getContentPane().setLayout(new BorderLayout(5,10));
JButton jb1=new JButton("1");
JButton jb2=new JButton("2");
JButton jb3=new JButton("3");
JButton jb4=new JButton("4");
JButton jb5=new JButton("5");
f.getContentPane().add(jb1,BorderLayout.NORTH);
f.getContentPane().add(jb2,BorderLayout.SOUTH);
f.getContentPane().add(jb3,BorderLayout.EAST);
f.getContentPane().add(jb4,BorderLayout.WEST);
f.getContentPane().add(jb5,BorderLayout.CENTER);
f.setVisible(true);
}
}
说明:
边框布局管理器类构造函数的两个参数分别为水平间隔象素数和垂直间隔象素数,上、下、左、右、中分别用北、南、西、东和中来表示。和流布局管理器类不同的地方在于,组件不会因为窗体大小的变化而移位,相反,组件通过自动缩放以保持原有的对应关系。
public class exec
{
public static void main(String [] args)
{
JFrame f=new JFrame("Hello!");
f.setLocation(10,100);
f.setSize(600,400);
f.setMinimumSize(new Dimension(200,100));
f.getContentPane().setLayout(new GridLayout(3,3,10,10));
JButton[] jb=new JButton[9];
for(int i=0;i<jb.length;i++)
{
jb=new JButton(String.valueOf(i));
f.getContentPane().add(jb);
}
f.setVisible(true);
}
}
红色显示的部分运行时出错了,可我不知道该怎么修改,帮忙看一下啊
看过你的代码,觉得你的意思是不想改变窗体的大小,并且正确摆放组件
我修改了一下,供参考:
import javax.swing.*;
import java.awt.*;
public class exec
{
public static void main(String [] args)
{
JFrame f=new JFrame("Hello!");
f.setLocation(10,100);
f.setResizable(false);
f.getContentPane().setLayout(new GridLayout(3,3,10,10));
JButton[] jb=new JButton[9];
for(int i=0;i<jb.length;i++)
{
jb[i]=new JButton(String.valueOf(i));
f.getContentPane().add(jb[i]);
}
f.pack();
f.setVisible(true);
}
}
我觉得这个问题并不难,需要查阅文档,你应当自己学着做,毕竟“渔”比“鱼”重要