Java布局管理器(三)之GridLayout(网格布局管理)和CardLayout( 卡片布局管理)

来源:互联网 发布:php分班系统 编辑:程序博客网 时间:2024/04/29 07:43

GridLayout(网格布局管理)

顾名思义,就是将容器分成一个个的二维表式的网格,其中布局中的每一个单元,即网格具有相同的尺寸,组件按行依次放入这些被划分出来的小格之中,组件的添加顺序是由左至右,由上到下顺序,与FlowLayout流式布局一样。这种布局管理器是按行与列排列对象的理想选择,是布局管理器中使用较多的一种。不过有一个要求,就是每个网格之中都必须要放组件,不能有空。如果GridLayout构造函数的行与列都被指定为零,则会抛出运行异常IllegalArgumentException。

在实际绘制的行与列的数目的时候也要依据容器内的组件数目而定。GridLayout会首先尝试观察所要求的行与列的数目。如果所要求的行数不为零,则列数通过(组件数+行数-1)/行数 来确定。如果我们的要求是零行,则所使用的行数由类似的公式确定:(组件数+列数-1)/列数。例如,如果我们请求一个3x3的网格,但是在布局中只放置4个组件,最终我们实际得到的是一个2x2的网格。如果我们想避免这种情况,那就要依据计划添加显示的实际对象数目来确定GridLayout尺寸。再比如,当行或列的数目设置为0(两者最多只能有一个为0),布局就会在零设置的方向上无限增长,即非零的方向固定不变,可不可以认为FlowLayout流式布局就是网格布局器的一种特例呢。

举个例子说明上面的公式:

setLayout(new GridLayout(0, 2)),并放置5各组件,则会根据上面公式计算出行数为3,即程序界面布局为3*2的网格,有6个网格放5各组件,最后一个为空,中间的不能为空。
如果组件数超过网格的数目,该布局管理器会自动增加网格的数目,原则上是保持行不变,只在列上增加。

在设计中有时候根据需求,我们不一定总能保证让每个网格处都能放置可供使用的组件,而上面的要求是不能有空的网格,那么我们也有解决方法。就是在需要的地方放置不可见的组件。比如说是空的标签等。

下面再说说该布局管理器的构造方法,有下列3种,当然也是为满足不同的场合需求:

1.GridLayout()参数为空,即默认以每行一列的方式构建一个GridLayout对象。

2. GridLayout(introw,intcolumns):根据指定行数和列数构造一个GridLayout对象,组件间距为0,就像上面所说的BorderLayout(边框布局管理)那样,有时候需要其他的间距,就要再添加一些参数老,第3种方法就是。

3. GridLayout(introw,intcolumns,int hgap,int,vgap): 根据指定行数和列数构造一个GridLayout对象,组件间距按指定值设置。

还有一些其他的方法:

int getColumns()  :获取此布局中的列数。

int getHgap():获取组件之间的水平间距。

int getRows() 获取此布局中的行数。

int getVgap()  获取组件之间的垂直间距。

void removeLayoutComponent(Component comp) 从布局移除指定组件。

void setColumns(int cols)  :将此布局中的列数设置为指定值。

void setHgap(int hgap):将组件之间的水平间距设置为指定值。

void setRows(int rows):将此布局中的行数设置为指定值。

void setVgap(int vgap) :将组件之间的垂直间距设置为指定值。

StringtoString():返回此网格布局的值的字符串表示形式。 

操作中,使用GridLayoutd的步骤如下:

       1.为容器设置布局管理器,并制定划分网格的行数和列数:setLayout(new GridLayout(row, columns));

       2.调用容器的add()方法加入组件

 既然这个布局管理器如此之较为常用,再举个程序设计的例子供大家参考(向一个视窗内添加一横行的3个按钮,颜色标记表示相应的方法,用时选择一种)

JFrame frame = new JFrame("Myframe");              //创建一个JFrame实例,名为MyFrame
                frame.setSize(400,300);                     //JFrame的大小
                frame.getContentPane().setBackground(Color.RED);                   //JFrame的背景颜色
                 frame.setLayout(newFlowLayout(FlowLayout.CENTER,50, 100));          //设置JFrame的布局管理器,其它组件均以流布式插入,比如说下面的容器JPanel
                 JPanel contentPane = newJPanel();              //创建一个JPanel实例
                contentPane.setSize(100,100)                      //定义该实例的大小;
                  //contentPane.setLayout(new GridLayout(1, 3));   //设置面板Jpanel的布局管理器为网格布局管理器1*3,中间不留空隙
                contentPane.setLayout(new GridLayout(1, 3, 20,30));         //该网格布局管理器个网格间的水平距离为20,垂直距离为30
                 //contentPane.setLayout(newGridLayout(1, 5));        //该布局器设置为1*5的,其中第二和第四个网格填充空的标签,就相当于个按钮之间留有空隙,这是是组件有间//隔的另一种方法,只是间隔中的组件我们看不到而已
                contentPane.setBackground(Color.YELLOW);
                 //定义3个按钮,并进行命名
                 JButton btn1 = newJButton("Start");
                 JButton btn2 =newJButton("Stop");
                 JButton btn3 =newJButton("Back");
                 contentPane.add(btn1);
                //contentPane.add(newJLabel());                  //填充空的标签
                 contentPane.add(btn2);
                 //contentPane.add(newJLabel());                  //填充空的标签
                 contentPane.add(btn3);

frame.add(contentPane);//把Jpanel容器添加到上面定义的JFrame中,而上面的JFrame是以组件均以FlowLayout流布式插入的

frame.setVisible(true);//显示可见

CardLayout( 卡片布局管理)

是JTabbedPane组件的默认管理器

CardLayout布局管理器是一种卡片式的布局管理器,他将容器中的组件处理成一系列的卡片,因为卡片的数量可以很多个,因此可以放很多组件,不过它每一时刻只能显示一张卡片上的内容,而这张卡片上的内容填充于整个容器。就像播放PPT幻灯片的场景。N多张幻灯片可以有很客观的容量,但每时刻观众所能看到的只是一张上的内容,而这张恰好填充满整个屏幕。因此该布局管理器与其他的布局管理器十分不同,其他的布局管理器尝试一次显示容器中的所有组件,而CardLayout一次只显示一个组件。这个组件可以是一个组件或是一个容器,而后者会让我们看到布局在基于嵌入容器的布局管理器之上的多个组件。所以呢我们可以用嵌套的方法让CardLayout依次显示多个组件,不过CardLayout与其他的布局管理器的本质区别我们一定要清楚,其他就不多说老。

使用构造方法CardLayout()可以构建CardLayout对象。组件按添加顺序存放在卡片序列中,使用方法add(Component,component,Stringname)将组件添加到容器中,其中name是卡片中组件的标识。

为了使组件在使用CardLayout容器中可见,可使用CardLayout对象的下列方法:

1)first(Containercontainer):显示第一张卡片。

2) last(Containercontainer):显示最后一张卡片。

3)nextContainercontainer):显示下一张卡片。

4)show(Containercontainer,String name):显示容器中指定名称的卡片。

 再谈一谈使用CardLayout的步骤:

       1.为容器设置布局管理器:setLayout(newCardLayout());

       2.调用add(Component,component,Stringname)的方法加入组件,并为组件制定各自的名字

       3.调用布局管理器CardLayout的show()方法,显示所需组件

 


原创粉丝点击