java--GUI程序设计中的布局

刚刚看完Java中布局的一下内容,之前没有注意布局,觉得不是很重要,现在发现GUI里面布局还是很重要的。
我个人觉得体现在如下几个方面:
(1)布局可以提高窗口的审美质量。
(2)布局在处理一下事件上还真的有实际的作用,可以更加简单易了的反映现实世界。
(3)可以使用户界面更加具有交互性。
综上只是我现在可以想到的作用,我觉得应该不只是这样。
下面步入正题:聊聊布局这事。
一:布局的种类
(1)FlowLayout(流式)布局管理器是最常见和最基础的一种布局,也是Jpanel的默认布局。组件是从左到右,从上到下排列的。其中组件之间的默认水平和垂直距离都是5(像素)。而且组件有默认的最佳大小。当然你也可以调用方法改变这个默认值。比如你不可以使用setsize()函数来改变组件的大小,但是你可以使用public void setPreferedSize(Dimension prefersize)来改变组件的默认大小值(一般是不去改变的)。
(2)null布局(绝对布局)。这个就是将一个容器布局设置为null,这种用的估计比较少。他有一个显著的特点就是组件的位置一旦固定下来,那么组件不会随着窗口大小的变化而变化。
(3)BorderLayout(边界)布局,他是Frame,JFrame底层容器的默认布局。在add()组件的时候可以设置他的位置(south,east,west,north,center)。需要注意的是每一个区域之内存放一个组件,当然你也可以使用Jpanel面板来实现存放多个组件。
(4)GridLayout(网格)布局 你可以在构造布局对象的时候设置他的行和列,也可以在这里设置水平和垂直距离。需要注意的是每一个网格只可以放一个组件,而且每个组件的大小是一样的。组件是从左到右,从上到下排列。到最后没有组件了,就空白位置。
(5)BoxLayout(盒式)布局。这种布局比较有意思!Box也是一种容器,是一种盒式布局的容器。盒式布局有个特点就是只有一行(行型)或者是一列(列型),比如行盒式布局是不会跑到第二行去的。以行说事:假如你要设置这一行中组件之间的距离,那么就要使用add方法向容器中添加一个支撑类对象Strut。比如Box box=new Box();box.add(Box.createHorizontaiStrut(8));
这里的Box.createHorizontaiStrut(8)就是Strut对象;‘8’是距离的设置,单位是像素。
上面的是对一些布局的介绍,下面说说我真正表达的东西.
二:有关布局的组合使用(嵌套)
使用容器的目的是向其添加组件,并根据需要设置合理的布局。在实际开发中一种布局往往是不能达到目的的,而是需要二中或者是使用多种布局的。下面看一个由几个BoxLayout布局组合的窗口。
代码如下:
package Test;
import java.awt.*;
import javax.swing.*;
public class WindowBoxLayout extends JFrame
{
public WindowBoxLayout()
{//基本设置!
this.setTitle(“学生信息管理”);
this.setVisible(true);
this.setBounds(100,100,300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setLayout(new FlowLayout());
/*
Box boxH1,boxH2,boxH3,boxV1;
boxH1=Box.createHorizontalBox();
boxH2=Box.createHorizontalBox();
boxH3=Box.createHorizontalBox();
boxV1=Box.createVerticalBox();

boxH1.add(new Label(“姓名”));
boxH1.add(Box.createHorizontalStrut(8));
boxH1.add(new JTextField(10));

boxH2.add(new Label(“email”));
boxH2.add(Box.createHorizontalStrut(2));
boxH2.add(new JTextField(10));
boxH3.add(new Label(“职业”));
boxH3.add(Box.createHorizontalStrut(8));
boxH3.add(new JTextField(10));
boxV1.add(boxH1);
boxV1.add(Box.createVerticalStrut(8));
boxV1.add(boxH2);
boxV1.add(Box.createVerticalStrut(8));
boxV1.add(boxH3);
this.add(boxV1);*/
Box boxV1,boxV2,boxH1;
boxV1=Box.createVerticalBox();
boxV2=Box.createVerticalBox();
boxV1.add(new JLabel(“姓名”));
boxV1.add(Box.createVerticalStrut(8));
boxV1.add(new JLabel(“email”));
boxV1.add(Box.createVerticalStrut(8));
boxV1.add(new JLabel(“职业”));
boxV2=Box.createVerticalBox();
boxV2.add(new JTextField(10));
boxV2.add(Box.createVerticalStrut(8));
boxV2.add(new JTextField(10));
boxV2.add(Box.createVerticalStrut(8));
boxV2.add(new JTextField(10));
boxV2.add(Box.createVerticalStrut(8));

boxH1=Box.createHorizontalBox();
boxH1.add(boxV1);
boxH1.add(Box.createHorizontalStrut(8));
boxH1.add(boxV2);
this.add(boxH1);
validate();
}

}
这里有二种方式
/**/里面的运行结果也是一样的,不过要注意一下他们水平支撑出现差异的原因;
运行结果
2再看看下面这个,由一个Border和一个Grid布局组成的窗口–棋盘
代码如下:
package 布局设计;
import java.awt.*;
import javax.swing.*;
class Window1 extends JFrame{
// JButton button1,button2;
public Window1()
{
this.setTitle(“国际象棋”);
//this.setLayout(new BorderLayout());

JLabel[][] label=new JLabel[12][12];
JPanel pan=new JPanel();
pan.setLayout(new GridLayout(12,12));
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
{
label[i][j]=new JLabel();
if((i+j)%2==0)
{
label[i][j].setBackground(Color.black);
label[i][j].setOpaque(true);//这里非常重要,设置JLabel为不透明的才行!
}
else{
label[i][j].setBackground(Color.white);
label[i][j].setOpaque(true);
}

pan.add(label[i][j]);

}
this.add(pan,BorderLayout.CENTER);
this.add(new Button(“北方参战者”),BorderLayout.NORTH);
this.add(new Button(“南方参战者”),BorderLayout.SOUTH);
this.add(new Button(“西方观察团”),BorderLayout.WEST);
this.add(new Button(“东方观察团”),BorderLayout.EAST);
this.setVisible(true);
this.setBounds(100, 100, 570, 390);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
validate();
System.out.println(“`(∩_∩)′”);
}
}
public class Window {
public static void main(String[] args) {

new Window1();
}

}
运行的结果如下:
棋盘
(3)通过使用不同布局的组合可以达到自己需求的目的,所以学好布局也是重要的一环!

猜你喜欢

转载自blog.csdn.net/huangchongwen/article/details/50340651