- 本人是一个大二的学生,在写完大作业之后,对大作业会使用的一些东西进行总结,在介绍布局之前,你首先要做一个窗口JFrame
JFrame 窗口的基本方法
- setBounds(int x,int y,int width,int heighth)
//设置窗口左上角的坐标,以及长和宽,一般提到的位置都是指窗口左上角的点在屏幕中的位置 - setVisiable(true)//这个一定要设置,不然看不见窗口
- setResizable(false)
//设置窗口是否可以调节大小,例如null布局中里面的组件大小都是固定的,一旦设置了true,窗口放大的时候,null布局里面的组件并不会放大,会导致有空白部分 - setDefaultCloseOperation(int operation)
//设置关闭规则,可选参数如下:
DO_NOTHING_ON_CLOSE(按下关闭按钮没有反应,即关不掉),
HIDE_ON_CLOSE (关闭之后,后台还在运行,只是隐藏了而已),
DISPOSE_ON_CLOSE (隐藏当前窗口,并释放窗体占有的其他资源),
EXIT_ON_CLOSE (真正的结束)
容器
接下来你应该用一个容器,因为JFrame没办法直接将组件添加上去,我们要将后面的组件添加到容器中
- Container c=frame.getContentPane();
//就是初始化一个容器,调用该方法后会得到窗口的内容面板
接下来开始操作介绍布局啦!!!
首先介绍一下如何设置布局,c.setLayout()//参数填你想要的布局方式
接下来介绍一些常用的布局
BorderLayout
c.setLayout(new BorderLayout());
这是最经常会使用到的布局,他会将窗口分为东西南北中五块,然后你对这五个地方进行组件放置
放置方法:c.add(组件,BorderLayout.CENTER) //这就是加入在窗口中间
其他地方没有组件放置时,并不会出现
JFrame frame=new JFrame("测试");
Container c=frame.getContentPane();
c.setLayout(new BorderLayout());
JButton btn=new JButton("中");
c.add(btn,BorderLayout.CENTER);
JButton btn1=new JButton("东");
c.add(btn1,BorderLayout.EAST);
JButton btn2=new JButton("南");
c.add(btn2,BorderLayout.SOUTH);
JButton btn3=new JButton("西");
c.add(btn3,BorderLayout.WEST);
JButton btn4=new JButton("北");
c.add(btn4,BorderLayout.NORTH);
frame.setVisible(true);
但是有一个问题,就是你想要每一块的大小不一样,现在怎么办呢?
这个时候你可以设置新的面板加进去容器当中,每个面板大小不一样就可以了!
JPanel panel=new JPanel();
JLabel label=new JLabel("北");
panel.setBackground(Color.BLUE);//设置面板颜色
panel.add(label);
panel.setSize(new Dimension(50,50));//改变面板大小
c.add(panel,BorderLayout.NORTH);
JPanel panel1=new JPanel();
JLabel label1=new JLabel("中");
panel1.add(label1);
panel1.setSize(new Dimension(100,50));//面板大小
c.add(panel1,BorderLayout.NORTH);
这样就可以设置自己想要的格局了
但是有时候BorderLyout的组件都会帮你居中显示,有时候你会想让北面的组件靠左显示,这时候怎么办呢??
这里提供一个思路
- 你可以在北部面板中再设置一次BorderLayout,想要靠左就把组件添加在西,这样就可以拉!
CardLayout
- CardLayout cardLayout=new CardLayout();
JPanel panel=new JPanel();
panel.setLayout(cardLayout);
这是一个卡片布局,就是类似于书本那样一页一页的翻页显示
我们需要用到的方法就是
-
panel.add(JPanel panel,String name)//添加面板,参数分别是新面板以及面板的名字
-
cardLayout.next(panel)
//注意是cardLayout,不是panel,参数是容器名称,即放置这个布局的容器,这个会显示当前组件的下一个组件,最后一个组件则切换到第一页
-
cardLayout.first(容器名称)
显示容器中第一个组件 cardLayout.last(容器名称)
显示容器中最后一个组件 cardLayout.previous(容器名称)
CardLayout cardLayout=new CardLayout();
JPanel panel=new JPanel();
panel.setLayout(cardLayout);
for(int i=1;i<=10;i++) {
JLabel label=new JLabel(Integer.toString(i));
panel.add(label,Integer.toString(i));//添加标签,并取名为i
}
JButton btn=new JButton("下一页");
btn.addActionListener(new ActionListener() {//添加监听
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
cardLayout.next(panel);//点击按钮会切到下一个,可以看到我已经是第六页了
}
});
c.add(panel,BorderLayout.CENTER);
c.add(btn,BorderLayout.SOUTH);
其他方法我就不展示啦
但其实我们有时候会想跳转到指定页面,怎么办呢?
这个时候可以使用
- cardLayout.show(容器名称,名字);
//则会跳转到指定页面,当页面不存在是不会跳转的
GirdLayout
JPanel panel=new JPanel();
panel.setLayout(new GridLayout(4,4)); //4×4
会将页面分割成一样大的格局,像巧克力那样一块一块的
panel.add(组件)
JPanel panel=new JPanel();
panel.setLayout(new GridLayout(4,4));
for(int i=1;i<=16;i++) {
JLabel label=new JLabel(Integer.toString(i));
label.setBorder(BorderFactory.createLineBorder(Color.gray));//设置边框线
panel.add(label);
}
c.add(panel,BorderLayout.CENTER);
- 当加入的组件大于你规定的方格数时,它会自己进行重新布局
当然没提到的还有很多布局,例如
- null布局:组件大小需要自己设置位置和大小,这个用起来很不方便,因为他的大小时固定的,窗口放大之后组件不会灵活变动大小,而且用起来很麻烦,每一个组件都需要调大小和位置
- 网格组布局:这个是网格布局的升级版,和网格布局不一样的是,组件可以设置跨越的行数/列数,但是用起来需要设置很多属性,所以个人觉得不太好用
- 流布局:会自己线性布局,和流水一样,但是个人觉得还是BorderLayout好用
分享结束,期待下一篇!