第八章建立Gu|s 本模块讲述图形用户界面的建立及布局。它介绍了抽象视窗工具包,一种建立GUIs的类包, Exception Handling 粪 poets Communications 第一节相关问题 讨论一下述问题与本模块中出现的材料相关 Java编程语言是一个具有独立平台的编程语言。GUI环境通常是从属平台。那么,为了使GUI平台独立,Java 技术是如何接近这个主题的呢? 第二节目的 完成本模块学习时,将能 描述AWT包及其组件 定义 Container、 Component及 Layout manager等术语,以及它们是如何在一起来建立GUI的 使用 Layout Manager 使用Flow、 Border、Gird及Card布局管理器来获得期望的动态布局 增加组件到 Container 正确运用 Frame及 Panel容器 描述如何使用嵌套容器来完成复杂的布局 在Java软件程序中,确认如下内容 容器 相关布局管理器 所有组件的布局层次
第八章 建立 GUIs 本模块讲述图形用户界面的建立及布局。它介绍了抽象视窗工具包,一种建立 GUIs 的类包。 第一节 相关问题 讨论—下述问题与本模块中出现的材料相关。 - Java 编程语言是一个具有独立平台的编程语言。GUI 环境通常是从属平台。那么,为了使 GUI 平台独立,Java 技术是如何接近这个主题的呢? 第二节 目 的 完成本模块学习时,将能: - 描述 AWT 包及其组件 - 定义 Container、Component 及 Layout Manager 等术语,以及它们是如何在一起来建立 GUI 的 - 使用 Layout Manager - 使用 Flow、Border、Gird 及 Card 布局管理器来获得期望的动态布局 - 增加组件到 Container - 正确运用 Frame 及 Panel 容器 - 描述如何使用嵌套容器来完成复杂的布局 - 在 Java 软件程序中,确认如下内容: - 容器 - 相关布局管理器 - 所有组件的布局层次
第三节AWT 提供基本的GUI组件,用在所有的 Java applets及应用程序中 具有可以扩展的超类,它们的属性是继承的,类也可被抽象化 确保显示在屏幕上的每个GUI组件都是抽象类组件的子类 Contaner,它是一个 Component的抽象子类,而且包括两个子类 Panel window AⅥT提供用于所有 Java applets及应用程序中的基本GUI组件,还为应用程序提供与机器的界面。这将保证一台计 算机上出现的东西与另一台上的相一致 在学AWT之前,简单回顾一下对象层次。记住,超类是可以扩展的,它们的属性是可继承的。而且,类可以被抽象化, 这就是说,它们是可被分成子类的模板,子类用于类的具体实现。 显示在屏幕上的每个GUI组件都是抽象类组件的子类。也就是说,每个从组件类扩展来的图形对象都与允许它们运行 的大量方法和实例变量共享。 Container是 Component的一个抽象子类,它允许其它的组件被嵌套在里面。这些组件也可以是允许其它组件被嵌套 在里面的容器,于是就创建了一个完整的层次结构。在屏幕上布置GUI组件,容器是很有用的。Pane是 Container的最 简单的类。 Container的另一个子类是 Window 第四节 Java. awt包 Java.awt包包含生成 WIDGETS和GUI组件的类。该包的基本情况如下图所示。黑体字的类表明该模块的要点。 jawa. lang Object Border Layout Checkbox Group Dimension Grid Bag Constraints Grid Bag Layout Rectangle MenuBar MeruItem - Menu-Popup Menu CheckbooeMenul tem Applet (java applet package Label 、」 Dialog-·-F11eDia1og Textcomponent-·1 TextArea Text Field Exceptions- AWTExceptian Errors AWTErr 第五节建立图形用户界面
105 第三节 AWT AWT - 提供基本的 GUI 组件,用在所有的 Java applets 及应用程序中 - 具有可以扩展的超类,它们的属性是继承的,类也可被抽象化 - 确保显示在屏幕上的每个 GUI 组件都是抽象类组件的子类 - Contaner,它是一个 Component 的抽象子类,而且包括两个子类 - Panel - window AWT 提供用于所有 Java applets 及应用程序中的基本 GUI 组件,还为应用程序提供与机器的界面。这将保证一台计 算机上出现的东西与另一台上的相一致。 在学 AWT 之前,简单回顾一下对象层次。记住,超类是可以扩展的,它们的属性是可继承的。而且,类可以被抽象化, 这就是说,它们是可被分成子类的模板,子类用于类的具体实现。 显示在屏幕上的每个 GUI 组件都是抽象类组件的子类。也就是说,每个从组件类扩展来的图形对象都与允许它们运行 的大量方法和实例变量共享。 Container 是 Component 的一个抽象子类,它允许其它的组件被嵌套在里面。这些组件也可以是允许其它组件被嵌套 在里面的容器,于是就创建了一个完整的层次结构。在屏幕上布置 GUI 组件,容器是很有用的。Panel 是 Container 的最 简单的类。Container 的另一个子类是 Window。 第四节 Java.awt 包 Java.awt 包包含生成 WIDGETS 和 GUI 组件的类。该包的基本情况如下图所示。黑体字的类表明该模块的要点。 第五节 建立图形用户界面
8.5.1 Container Container Container的两个主要类型是 Window和 Panel Window是Java.awt. Window.的对象 Panel是Java.awt.Pane的对象 Container有两个主要类型: Window和 Panel Window是Java.awt. Window.的对象。 Window是显示屏上独立的本机窗口,它独立于其它容器。 Window有两种形式: Frame(框架)和 Dialog(对话框)。 Frame和 Dialog是 Window的子类。 Frame是一个带有标题 和缩放角的窗口。对话没有菜单条。尽管它能移动,但它不能缩放 Panel是Java.awt. Panel的对象。 Panel包含在另一个容器中,或是在Web浏览器的窗口中。 Panel确定一个四边形, 其它组件可以放入其中。 Panel必须放在 Window之中(或 Window的子类中)以便能显示出来 注一容器不但能容纳组件,还能容纳其它容器,这一事实对于建立复杂的布局是关键的,也是基本的。 滚动块也是 Window的一个子类。它在模块10“AWT组件集”里讨论。 85.2定位组件 定位组件 容器里的组件的位置和大小是由布局管理器决定的。 可以通过停用布局管理器来控制组件的大小或位置 后必须用组件上的 setlocation0, setsize0,或 setBounds0来定位它们在容器里的位置 容器里的组件的位置和大小是由布局管理器决定的。容器对布局管理器的特定实例保持一个引用。当容器需要定位 个组件时,它将调用布局管理器来做。当决定一个组件的大小时,同样如此。布局管理器完全控制容器内的所有组件。它 负责计算并定义上下文中对象在实际屏幕中所需的大小。 853组件大小 因为布局管理器负责容器里的组件的位置和大小,因此不需要总是自己去设定组件的大小或位置。如果想这样做(使 用 setlocationo, sets ize()或 setBoundso方法中的任何一种),布局管理器将覆盖你的决定 如果必须控制组件的大小或位置,而使用标准布局管理器做不到,那就可能通过将下述方法调用发送到容器中来中止 布局管理器 做完这一步,必须对所有的组件使用 setlocationo,sets ize)或 setboundso,来将它们定位在容器中。请注意,由于窗 口系统和字体大小之间的不同,这种办法将导致从属于平台的布局。更好的途径是创建布局管理器的新子类 第六节 Frames 是 Window的子类 具有标题和缩放角 从组件继承并以add方式添加组件 能以字符串规定的标题来创建不可见框架对象
106 8.5.1 Container Container - Container 的两个主要类型是 Window 和 Panel - Window 是 Java.awt.Window.的对象 - Panel 是 Java.awt.Panel 的对象 Container 有两个主要类型:Window 和 Panel Window 是 Java.awt.Window.的对象。Window 是显示屏上独立的本机窗口,它独立于其它容器。 Window 有两种形式:Frame(框架)和 Dialog(对话框)。Frame 和 Dialog 是 Window 的子类。Frame 是一个带有标题 和缩放角的窗口。对话没有菜单条。尽管它能移动,但它不能缩放。 Panel 是 Java.awt.Panel 的对象。Panel 包含在另一个容器中,或是在 Web 浏览器的窗口中。Panel 确定一个四边形, 其它组件可以放入其中。Panel 必须放在 Window 之中(或 Window 的子类中)以便能显示出来。 注—容器不但能容纳组件,还能容纳其它容器,这一事实对于建立复杂的布局是关键的,也是基本的。 滚动块也是 Window 的一个子类。它在模块 10“AWT 组件集”里讨论。 8.5.2 定位组件 定位组件 - 容器里的组件的位置和大小是由布局管理器决定的。 - 可以通过停用布局管理器来控制组件的大小或位置。 然后必须用组件上的 setLocation(),setSize(),或 setBounds()来定位它们在容器里的位置。 容器里的组件的位置和大小是由布局管理器决定的。容器对布局管理器的特定实例保持一个引用。当容器需要定位一 个组件时,它将调用布局管理器来做。当决定一个组件的大小时,同样如此。布局管理器完全控制容器内的所有组件。它 负责计算并定义上下文中对象在实际屏幕中所需的大小。 8.5.3 组件大小 因为布局管理器负责容器里的组件的位置和大小,因此不需要总是自己去设定组件的大小或位置。如果想这样做(使 用 setLocation(),setSize()或 setBounds()方法中的任何一种),布局管理器将覆盖你的决定。 如果必须控制组件的大小或位置,而使用标准布局管理器做不到,那就可能通过将下述方法调用发送到容器中来中止 布局管理器: setLayout(null); 做完这一步,必须对所有的组件使用 setLocation(),setSize()或 setBounds(),来将它们定位在容器中。请注意,由于窗 口系统和字体大小之间的不同,这种办法将导致从属于平台的布局。更好的途径是创建布局管理器的新子类。 第六节 Frames Frames - 是 Window 的子类 - 具有标题和缩放角 - 从组件继承并以 add 方式添加组件 - 能以字符串规定的标题来创建不可见框架对象
将 Border layout当做缺省布局管理器 ut方式来改变缺省布局管理器 Frames是 Window的一个子类。它是带有标题和缩放角的窗口。它继承于 Java. awt Container,因此,可以用addO方 式来给框架添加组件。框架的缺省布局管理器就是 Border Layout。它可以用 setlayoutl方式来改变 框架类中的构造程序 Frame(string)用由 String规定的标题来创建一个新的不可见的框架对象。当它还处于不可见状 态时,将所有组件添加到框架中 1. import java. awt. *i 2. public class My Er ame extends Frame t 3. public static void main (String args [] MyFrame fr new My Frame("Hello Out There ! )i fr setsize(500, 500); 4. fr setBackground( Color blue )i fr setvisible(true)i public My Frame (String str) t 上述程序创建了下述框架,它有一个具体的标题、大小及背景颜色 Hello out Therc! 注一在框架显示在屏幕上之前,必须做成可见的(通过调用程序 setvisible(true)),而且其大小是确定的(通过 调用程序 setsize0或pack0)。 第七节 Panels Panels 为组件提供空间 -允许子面板拥有自己的布局管理器 象 frames一样, Panels提供空间来连接任何GUI组件,包括其它面板。每个面板都可以有它自己的布管理程序。 一旦一个面板对象被创建,为了能看得见,它必须添加到窗口或框架对象上。用 Container类中的adO方式可以做到这
107 - 能将 Border Layout 当做缺省布局管理器 - 用 setLayout 方式来改变缺省布局管理器 Frames 是 Window 的一个子类。它是带有标题和缩放角的窗口。它继承于 Java.awt.Container,因此,可以用 add()方 式来给框架添加组件。框架的缺省布局管理器就是 Border Layout。它可以用 setLayout()方式来改变。 框架类中的构造程序 Frame(String)用由 String 规定的标题来创建一个新的不可见的框架对象。当它还处于不可见状 态时,将所有组件添加到框架中。 1. import java.awt.*; 2. public class MyFrame extends Frame { 3. public static void main (String args[]) { 6. MyFrame fr = new MyFrame("Hello Out There!"); 7. fr.setSize(500,500); 4. fr.setBackground(Color.blue); 5. fr.setVisible(true); 6. } 7. public MyFrame (String str) { 8. super(str); 9. } 10. } 上述程序创建了下述框架,它有一个具体的标题、大小及背景颜色。 注—在框架显示在屏幕上之前,必须做成可见的(通过调用程序 setVisible(true)),而且其大小是确定的(通过 调用程序 setSize()或 pack())。 第七节 Panels Panels - 为组件提供空间 - 允许子面板拥有自己的布局管理器 - 以 add 方法添加组件 象 Frames 一样,Panels 提供空间来连接任何 GUI 组件,包括其它面板。每个面板都可以有它自己的布管理程序。 一旦一个面板对象被创建,为了能看得见,它必须添加到窗口或框架对象上。用 Container 类中的 add()方式可以做到这 一点
下面的程序创建了一个小的黄色面板,并将它加到一个框架对象上 1. import java. awt. *i 2. public class FrameWith Panel extends Frame t / Cons truc public Frame With anel (String str) i super (str)i 67891111 public static void main (String args [])i FramewithPanel fr new FrameWithPanel (Frame with Panel") Panel pan new Panel()i fr setsize(200, 200)i fr setBackground Color blue) fr. setLayout (null);//override default la yout mgr pan setsize (100, 100)i pan setBackground( Color yellow) fr. add(pan)i fr setvisible(true)i xd Frame with Panel 第八节容器布局( Container Layout 容器布局( Container Layout)
108 下面的程序创建了一个小的黄色面板,并将它加到一个框架对象上: 1. import java.awt.*; 2. public class FrameWithPanel extends Frame { 3. 4. // Constructor 5. public FrameWithPanel (String str) { 6. super (str); 7. } 8. 9. public static void main (String args[]) { 10. FrameWithPanel fr = 11. new FrameWithPanel ("Frame with Panel"); 12. Panel pan = new Panel(); 13. 14. fr.setSize(200,200); 15. fr.setBackground(Color.blue); 16. fr.setLayout(null); //override default layout mgr 17. pan.setSize (100,100); 18. pan.setBackground(Color.yellow); 19. 20. fr.add(pan); 21. fr.setVisible(true); 22. } 23. .... 24. 第八节 容器布局(Container Layout) 容器布局(Container Layout) - 流程布局(Flow Layout)
框布局 Border layour 网格布局( Grid Layout) 卡布局( Card layout) 网格包布局( Grid Bag Layout) 容器中组件的布局通常由布局管理器控制。每个 Container(比如一个Pane或一个 Frame)都有一个与它相关的缺省 布局管理器,它可以通过调用 setlayou0来改变 布局管理器负责决定布局方针以及其容器的每一个子组件的大小。 第九节布局管理器 下面的布局管理器包含在Java编程语言中: Flow Layout-Panel和 Applets的缺省布局管理器 Border Layout-Window、 Dialog及 Frame的缺省管理程序 Grid Layout Grid Bag布局管理器在本模块中不深入讨论。 Flow Layout的一个简单例子 这个样板代码阐述了几个要点,将在下一节讨论。 import java. awt public class ExGui t private Frame f private Button bl; public static void main(String args[]) ExGui guiwindow new ExGui()i guiwindow. go() public void go()i f. setLayout(new FlowLa yout()) bl new But ton(Press Me ")i b2 new But ton("Don't Press Me")i f. add(b1)i f. add (b2) f setvisible(true
109 - 边框布局(Border Layout) - 网格布局(Grid Layout) - 卡布局(Card Layout) - 网格包布局(GridBag Layout) 容器中组件的布局通常由布局管理器控制。每个 Container(比如一个 Panel 或一个 Frame)都有一个与它相关的缺省 布局管理器,它可以通过调用 setLayout()来改变。 布局管理器负责决定布局方针以及其容器的每一个子组件的大小。 第九节 布局管理器 下面的布局管理器包含在 Java 编程语言中: - Flow Layout—Panel 和 Applets 的缺省布局管理器 - Border Layout—Window、Dialog 及 Frame 的缺省管理程序 - Grid Layout - Card Layout - GridBag Layout GridBag 布局管理器在本模块中不深入讨论。 Flow Layout 的一个简单例子 这个样板代码阐述了几个要点,将在下一节讨论。 1. import java.awt.*; 2. 3. public class ExGui { 4. private Frame f; 5. private Button b1; 6. private Button b2; 7. 8. public static void main(String args[]) { 9. ExGui guiWindow = new ExGui(); 10. guiWindow.go(); 11. } 12. 13. public void go() { 14. f = new Frame("GUI example"); 15. f.setLayout(new FlowLayout()); 16. b1 = new Button("Press Me"); 17. b2 = new Button("Don't Press Me"); 18. f.add(b1); 19. f.add(b2); 20. f.pack(); 21. f.setVisible(true);
main(方法 本例中第8行main(方法有两个作用。首先,它创建了ExGu对象的一个实例。回想一下,直到一个实例存在,还没 有被称做f,b1和b2的真实数据项可以使用。第二,当数据空间被创建时, maino在该实例的上下文中调用实例方法go 在go中,真正的运行才开始 new Frame(“ GUI Example”) 这个方法创建 Java awt. Frame类的一个实例。根据本地协议,在Java编程语言中, Frame是顶级窗口,带有标题条- 在这种情况下,标题条由构造程序参数“ GUI Example”定义一缩放柄,以及其它修饰 f. setLayout(new Flow Layout) 这个方法创建Flw布局管理器的一个实例,并将它安装在框架中。对于每个 Frame、 Border布局来说,都有一个布 局管理器,但本例中没有使用。Flow布局管理器在AWT中是最简单的,它在某种程度上象一个页面中的单词被安排成 一行一行的那样来定位组件。请注意,Flow布局缺省地将每一行居中。 new Button(“ Press me”) 这个方法创建 Javaawt Button类的一个实例。按钮是从本地窗口工具包中取出的一个标准按钮。按钮标签是由构造程 序的字符串参数定义 f. add(bl) 这个方法告诉框架f(它是一个容器),它将包容组件b1。bl的大小和位置受从这一点向前的 Frame布局管理器的 控制 f packO 这个方法告诉框架来设定大小,能恰好密封它所包含的组件。为了确定框架要用多大, f packO询问布局管理器,在 框架中哪个负责所有组件的大小和位置 f set Visible(true) 这个方法使框架以及其所有的内容变成用户看得见的东西 第190页代码的最终结果是: 891FIow布局管理器 第190页例子中所用的Flow布局对组件逐行地定位。每完成一行,一个新行便又开始。 与其它布局管理器不一样,Flow布局管理器不限制它所管理的组件的大小,而是允许它们有自己的最佳大小 如果想将组件设定缺省居中的话,Flow布局构造程序参数允许将组件左对齐或右对齐。 如果想在组件之间创建一个更大的最小间隔,可以规定一个界限 当用户对由Flow布局管理的区域进行缩放时,布局就发生变化。如 Flow L Flow Layout After user or ok Open program resizes ok open! Close] Close
110 22. } 23. } main()方法 本例中第 8 行 main()方法有两个作用。首先,它创建了 ExGui 对象的一个实例。回想一下,直到一个实例存在,还没 有被称做 f,b1 和 b2 的真实数据项可以使用。第二,当数据空间被创建时,main()在该实例的上下文中调用实例方法 go()。 在 go()中,真正的运行才开始。 new Frame (“GUI Example”) 这个方法创建 Java.awt.Frame 类的一个实例。根据本地协议,在 Java 编程语言中,Frame 是顶级窗口,带有标题条— 在这种情况下,标题条由构造程序参数“GUI Example”定义—缩放柄,以及其它修饰。 f.setLayout (new FlowLayout()) 这个方法创建 Flow 布局管理器的一个实例,并将它安装在框架中。对于每个 Frame、Border 布局来说,都有一个布 局管理器,但本例中没有使用。Flow 布局管理器在 AWT 中是最简单的,它在某种程度上象一个页面中的单词被安排成 一行一行的那样来定位组件。请注意,Flow 布局缺省地将每一行居中。 new Button(“Press Me”) 这个方法创建 Java.awt.Button 类的一个实例。按钮是从本地窗口工具包中取出的一个标准按钮。按钮标签是由构造程 序的字符串参数定义的。 f.add(b1) 这个方法告诉框架 f(它是一个容器),它将包容组件 b1。b1 的大小和位置受从这一点向前的 Frame 布局管理器的 控制。 f.pack() 这个方法告诉框架来设定大小,能恰好密封它所包含的组件。为了确定框架要用多大,f.pack()询问布局管理器,在 框架中哪个负责所有组件的大小和位置。 f.setVisible(true) 这个方法使框架以及其所有的内容变成用户看得见的东西。 第 190 页代码的最终结果是: 8.9.1 Flow 布局管理器 第 190 页例子中所用的 Flow 布局对组件逐行地定位。每完成一行,一个新行便又开始。 与其它布局管理器不一样,Flow 布局管理器不限制它所管理的组件的大小,而是允许它们有自己的最佳大小。 如果想将组件设定缺省居中的话,Flow 布局构造程序参数允许将组件左对齐或右对齐。 如果想在组件之间创建一个更大的最小间隔,可以规定一个界限。 当用户对由 Flow 布局管理的区域进行缩放时,布局就发生变化。如:
下面的例子就是如何用类容器的 set layou0方法来创建Flow布局对象并安装它们 setLayout(new FlowLayout(int align, int hgap, int vgap)) 对齐的值必须是 Flow Layout. LEFT, FlowLayout. RIGHT,或 Flow Layout. CENTER。例如: Layout( new Flow Layout( FlowLayout. RIGHT, 20, 40)); 下述程序构造并安装一个新Fow布局,它带有规定好的对齐方式以及一个缺省的5单位的水平和垂直间隙。对齐的 值必须是 FlowLayout LEFT, Flow Layout RIGHT,或 Flow Layout. CENTER setLayout (new FlowLayout (int align)i setLayout(new FlowLayout(FlowLayout LEFT)); 下述程序构造并安装一个新Flow布局,它带有规定好的居中对齐方式和一个缺省的5单位的水平和垂直间隙。 setLayout(new FlowLayout())i 这个模块代码将几个按钮添加到框架中的一个Flow布局中 1. import java. awt.* 3. public class YeLow t 4 private Button button, button2, but ton3 My Flow mflow new My Flow ()i mflowgo()i public void go () f new Frame ("Flow Layout") f setIa yout(new FlowLa yout())i button3 new But ton("Close")i f. add (button 2) f. add(button 3) f setvisible(true)
111 下面的例子就是如何用类容器的 setLayout()方法来创建 Flow 布局对象并安装它们。 setLayout(new FlowLayout(int align,int hgap, int vgap)); 对齐的值必须是 FlowLayout.LEFT, FlowLayout.RIGHT,或 FlowLayout.CENTER。例如: setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 40)); 下述程序构造并安装一个新 Flow 布局,它带有规定好的对齐方式以及一个缺省的 5 单位的水平和垂直间隙。对齐的 值必须是 FlowLayout.LEFT, FlowLayout.RIGHT,或 FlowLayout.CENTER。 setLayout(new FlowLayout(int align); setLayout(new FlowLayout(FlowLayout.LEFT)); 下述程序构造并安装一个新 Flow 布局,它带有规定好的居中对齐方式和一个缺省的 5 单位的水平和垂直间隙。 setLayout(new FlowLayout()); 这个模块代码将几个按钮添加到框架中的一个 Flow 布局中: 1. import java.awt.*; 2. 3. public class MyFlow { 4. private Frame f; 5. private Button button1, button2, button3; 6. 7. public static void main (String args[]) { 8. MyFlow mflow = new MyFlow (); 9. mflow.go(); 10. } 11. 12. public void go() { 13. f = new Frame ("Flow Layout"); 14. f.setLayout(new FlowLayout()); 15. button1 = new Button("Ok"); 16. button2 = new Button("Open"); 17. button3 = new Button("Close"); 18. f.add(button1); 19. f.add(button2); 20. f.add(button3); 21. f.setSize (100,100); 22. f.setVisible(true); 23. } 24. }
8.92 Border布局管理器 Border布局管理器为在一个Pane或 Window中放置组件提供一个更复杂的方案。 Border布局管理器包括五个明显的 区域:东、南、西、北、中 北占据面板的上方,东占据面板的右侧,等等。中间区域是在东、南、西、北都填满后剩下的区域。当窗口垂直延伸 中区域也延伸:而当窗口水平延伸时,东、西、中区域也延伸。 Border布局管理器是用于Dalg和 Frame的缺省布局管理器。下例的代码是在第193页上: BorderLayout 注一当窗口缩放时,按钮相应的位置不变化,但其大小改变 下面的代码对前例进行了修改,表示出了 Border布局管理器的特性。可以用从 Container类继承的 setLayout0方 法来将布局设定为 Border布局 3. public class ExGui2 i private Button bn, bs, bw, be,bc; public static void main(String args[])i public void go() t bw new But ton(B4")i
112 8.9.2 Border 布局管理器 Border 布局管理器为在一个 Panel 或 Window 中放置组件提供一个更复杂的方案。Border 布局管理器包括五个明显的 区域:东、南、西、北、中。 北占据面板的上方,东占据面板的右侧,等等。中间区域是在东、南、西、北都填满后剩下的区域。当窗口垂直延伸 时,东、西、中区域也延伸;而当窗口水平延伸时,东、西、中区域也延伸。 Border 布局管理器是用于 Dialog 和 Frame 的缺省布局管理器。下例的代码是在第 193 页上: 注—当窗口缩放时,按钮相应的位置不变化,但其大小改变。 下面的代码对前例进行了修改,表示出了 Border 布局管理器的特性。可以用从 Container 类继承的 setLayout()方 法来将布局设定为 Border 布局。 1. import java.awt.*; 2. 3. public class ExGui2 { 4. private Frame f; 5. private Button bn, bs, bw, be, bc; 6. 7. public static void main(String args[]) { 8. ExGui2 guiWindow2 = new ExGui2(); 9. guiWindow2.go(); 10. } 11. 12. public void go() { 13. f = new Frame("Border Layout"); 14. bn = new Button("B1"); 15. bs = new Button("B2"); 16. be = new Button("B3"); 17. bw = new Button("B4");
bc new But ton("B5 ") f. add(bn, BorderLayout. NORTH) f. add(bs, BorderLayout. SOU TH) f. add(be, BorderLayout. EAST) f. add(bw, BorderLayout. WEST); f. add(bc, BorderLayout. CENTER) f setsize (200,200)i f setvisible(true)i 下面这一行 setLayout(new BorderLa yout())i 构造并安装一个新 Border布局,在组件之间没有间隙 setLayout(new BorderLa yout(int hgap, 构造并安装一个 Border布局,在由hgap和 规定的组件之间有规定的间隙 在布局管理器中组件必须被添加到指定的区域,而且还看不见。区域名称拼写要正确,尤其是在选择不使用常量(如 ad( button," Center”))而使用add( but ton, Borderlayout. CENTER)时。拼写与大写很关键 可以使用 Border布局管理器来产生布局,且带有在缩放时在一个方向 向或双方向上都延伸的元素 口水平缩放 北、中区域变化;如果窗口垂直缩放,东、 、西、中区域变化; 如果离开一个 Border布局未使用的区域,,好象它的大小为0。中央区域即使在不含组件的情况下仍然呈现为背景 可以仅将单个组件添加到 Border布局管理器五个区域的每一个当中。如果添加不止一个,只有最后一个看得见 面的模块将演示如何用中间容器来允许不止一个组件被放在单个 Border布局管理器区域的空间里。 注一布局管理器给予南、北组件最佳高度,并强迫它们与容器一样宽。但对于东、西组件,给予最佳宽度,而高度 受到限制。 8.93Grid布局管理器 Grid布局管理器为放置组件提供了灵活性。用许多行和栏来创建管理程序。然后组件就填充到由管理程序规定的单 元中。比如,由语句 new gridlayou(3,2)创建的有三行两栏的Grid布局能产生如下六个单元: 因为有 Border布局管理器,组件相应的位置不随区域的缩放而改变。只是组件的大小改变 ir Grid example 2 After window is resized 135
113 18. bc = new Button("B5"); 19. 20. f.add(bn, BorderLayout.NORTH); 21. f.add(bs, BorderLayout.SOUTH); 22. f.add(be, BorderLayout.EAST); 23. f.add(bw, BorderLayout.WEST); 24. f.add(bc, BorderLayout.CENTER); 25. 26. f.setSize (200, 200); 27. f.setVisible(true); 28. } 29. } 下面这一行: setLayout(new BorderLayout()); 构造并安装一个新 Border 布局,在组件之间没有间隙。 这一行 setLayout(new BorderLayout(int hgap, int vgap); 构造并安装一个 Border 布局,在由 hgap 和 vgap 规定的组件之间有规定的间隙。 在布局管理器中组件必须被添加到指定的区域,而且还看不见。区域名称拼写要正确,尤其是在选择不使用常量(如 add(button,”Center”))而使用 add(button,BorderLayout.CENTER)时。拼写与大写很关键。 可以使用 Border 布局管理器来产生布局,且带有在缩放时在一个方向、另一方向或双方向上都延伸的元素。 注—如果窗口水平缩放,南、北、中区域变化;如果窗口垂直缩放,东、西、中区域变化; 如果离开一个 Border 布局未使用的区域,,好象它的大小为 0。中央区域即使在不含组件的情况下仍然呈现为背景。 可以仅将单个组件添加到 Border 布局管理器五个区域的每一个当中。如果添加不止一个,只有最后一个看得见。后 面的模块将演示如何用中间容器来允许不止一个组件被放在单个 Border 布局管理器区域的空间里。 注—布局管理器给予南、北组件最佳高度,并强迫它们与容器一样宽。但对于东、西组件,给予最佳宽度,而高度 受到限制。 8.9.3 Grid 布局管理器 Grid 布局管理器为放置组件提供了灵活性。用许多行和栏来创建管理程序。然后组件就填充到由管理程序规定的单 元中。比如,由语句 new GridLayout(3,2)创建的有三行两栏的 Grid 布局能产生如下六个单元: 因为有 Border 布局管理器,组件相应的位置不随区域的缩放而改变。只是组件的大小改变