按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
不同。另外,布局管理器使我们的程序片或应用程序适合窗口的大小,所以,如果窗口的尺寸改变(例如,
在HTML 页面的程序片指定的规格),组件的大小,形状和位置都会改变。
程序片和帧类都是来源于包含和显示组件的容器。(这个容器也是一个组件,所以它也能响应事件。)在容
器中,调用 setLayout()方法允许我选择不同的布局管理器。
在这节里我们将探索不同的布局管理器,并安放按钮在它们之上。这里没有捕捉按钮的事件,正好可以演示
如何布置这些按钮。
13。12。1 FlowLayout
到目前为止,所有的程序片都被建立,看起来使用一些不可思议的内部逻辑来布置它们的组件。那是因为程
序使用一个默认的方式:FlowLayout。这个简单的“Flow ”的组件安装在窗体中,从左到右,直到顶部的空
格全部再移去一行,并继续循环这些组件。
这里有一个例子明确地(当然也是多余地)设置一个程序片的布局管理器去FlowLayout,然后在窗体中安放
按钮。我们将注意到FlowLayout 组件使用它们本来的大小。例如一个按钮将会变得和它的字串符一样的大
小。
//: FlowLayout1。java
// Demonstrating the FlowLayout
import java。awt。*;
import java。applet。*;
public class FlowLayout1 extends Applet {
public void init() {
setLayout(new FlowLayout());
for(int i = 0; i 《 20; i++)
add(new Button(〃Button 〃 + i));
}
} ///:~
所有组件将在FlowLayout 中被压缩为它们的最小尺寸,所以我们可能会得到一些奇怪的状态。例如,一个标
签会合适它自已的字符串的尺寸,所以它会右对齐产生一个不变的显示。
13。12。2 BorderLayout
布局管理器有四边和中间区域的概念。当我们增加一些事物到使用 BorderLayout 的面板上时我们必须使用
add()方法将一个字符串对象作为它的第一个自变量,并且字符串必须指定(正确的大写)“North”
(上),“South”(下),“west ”(左),“East ”(右)或者“Center”。如果我们拼写错误或没有大
写,就会得到一个编译时的错误,并且程序片不会像你所期望的那样运行。幸运的是,我们会很快发现在
393
…………………………………………………………Page 395……………………………………………………………
Java 1。1 中有了更多改进。
这是一个简单的程序例子:
//: BorderLayout1。java
// Demonstrating the BorderLayout
import java。awt。*;
import java。applet。*;
public class BorderLayout1 extends Applet {
public void init() {
int i = 0;
setLayout(new BorderLayout());
add(〃North〃; new Button(〃Button 〃 + i++));
add(〃South〃; new Button(〃Button 〃 + i++));
add(〃East〃; new Button(〃Button 〃 + i++));
add(〃West〃; new Button(〃Button 〃 + i++));
add(〃Center〃; new Button(〃Button 〃 + i++));
}
} ///:~
除了“Center”的每一个位置,当元素在其它空间内扩大到最大时,我们会把它压缩到适合空间的最小尺
寸。但是,“Center”扩大后只会占据中心位置。
BorderLayout 是应用程序和对话框的默认布局管理器。
13。12。3 GridLayout
GridLayout 允许我们建立一个组件表。添加那些组件时,它们会按从左到右、从上到下的顺序在网格中排
列。在构建器里,需要指定自己希望的行、列数,它们将按正比例展开。
//: GridLayout1。java
// Demonstrating the GridLayout
import java。awt。*;
import java。applet。*;
public class GridLayout1 extends Applet {
public void init() {
setLayout(new GridLayout(7;3));
for(int i = 0; i 《 20; i++)
add(new Button(〃Button 〃 + i));
}
} ///:~
在这个例子里共有 21 个空位,但却只有 20 个按钮,最后的一个位置作留空处理;注意对GridLayout 来说,
并不存在什么“均衡”处理。
13。12。4 CardLayout
CardLayout 允许我们在更复杂的拥有真正的文件夹卡片与一条边相遇的环境里创建大致相同于“卡片式对话
框”的布局,我们必须压下一个卡片使不同的对话框带到前面来。在 AWT 里不是这样的:CardLayout 是简单
的空的空格,我们可以自由地把新卡片带到前面来。(JFC/Swing 库包括卡片式的窗格看起来非常的棒,且
可以我们处理所有的细节。)
1。 联合布局(bining layouts)
394
…………………………………………………………Page 396……………………………………………………………
下面的例子联合了更多的布局类型,在最初只有一个布局管理器被程序片或应用程序操作看起来相当的困
难。这是事实,但如果我们创建更多的面板对象,每个面板都能拥有一个布局管理器,并且像被集成到程序
片或应用程序中一样使用程序片或应用程序的布局管理器。这就象下面程序中的一样给了我们更多的灵活
性:
//: CardLayout1。java
// Demonstrating the CardLayout
import java。awt。*;
import java。applet。Applet;
class ButtonPanel extends Panel {
ButtonPanel(String id) {
setLayout(new BorderLayout());
add(〃Center〃; new Button(id));
}
}
public class CardLayout1 extends Applet {
Button
first = new Button(〃First〃);
second = new Button(〃Second〃);
third = new Button(〃Third〃);
Panel cards = new Panel();
CardLayout cl = new CardLayout();
public void init() {
setLayout(new BorderLayout());
Panel p = new Panel();
p。setLayout(new FlowLayout());
p。add(first);
p。add(second);
p。add(third);
add(〃North〃; p);
cards。setLayout(cl);
cards。add(〃First card〃;
new ButtonPanel(〃The first one〃));
cards。add(〃Second card〃;
new ButtonPanel(〃The second one〃));
cards。add(〃Third card〃;
new ButtonPanel(〃The third one〃));
add(〃Center〃; cards);
}
public boolean action(Event evt; Object arg) {
if (evt。target。equals(first)) {
cl。first(cards);
}
else if (evt。target。equals(second)) {
cl。first(cards);
cl。next(cards);
}
else if (evt。target。equals(third)) {
cl。last(cards);
}
395
…………………………………………………………Page 397……………………………………………………………
else
return super。action(evt; arg);
return true;
}
} ///:~
这个例子首先会创建一种新类型的面板:BottonPanel (按钮面板)。它包括一个单独的按钮,安放在
BorderLayout 的中央,那意味着它将充满整个的面�