目录
第1章 成为程序员 1.1 选择编程语言 1.2 告诉计算机做什么 1.3 程序的工作原理 1.4 为什么程序不能正常工作 1.5 选择 Java编程工具 1.6 安装 Java开发工具 1.7 总结 1.8 问与答 1.9 测验 1.9.1 问题 1.9.2 答案 1.10 练习 第2章 编写第一个程序 2.1 编写程序所需的工具 2.2 创建 Saluton 程序 2.3 开始输入程序 2.3.1 class语句 2.3.2 main语句的作用 2.3.3 大括号 2.4 在变量中存储信息 2.5 保存编写好的程序 2.6 将程序编译为 class文件 2.7 修复错误 2.8 运行 Java程序 2.9 总结 2.10 问与答 2.11 测验 2.11.1 问题 2.11.2 答案 2.12 练习 第3章 Java之旅 3.1 第一站:Oracle 3.2 去 Java学校 3.3 在 JavaWorld 用午餐 3.4 在 NASA仰望天穹 3.5 回归正题 3.6 到 Java Boutique 去问路 3.7 在手机上运行 Java 3.8 总结 3.9 问与答 3.10 测验 3.10.1 问题 3.10.2 答案 3.11 练习 第4章 理解Java程序的工作原理 4.1 创建应用程序 4.2 向应用程序传递参数 4.3 创建 applet 4.4 总结 4.5 问与答 4.6 测验 4.6.1 问题 4.6.2 答案 4.7 练习 第5章 在程序中存储和修改信息 5.1 语句和表达式 5.2 指定变量类型 5.2.1 整数和浮点数 5.2.2 字符和字符串 5.2.3 其他数值类型的变量 5.2.4 布尔型变量 5.3 给变量命名 5.4 在变量中存储信息 5.5 运算符 5.5.1 变量的递增与递减 5.5.2 运算符优先级 5.6 使用表达式 5.7 总结 5.8 问与答 5.9 测验 5.9.1 问题 5.9.2 答案 5.10 练习 第6章 使用字符串来交流 6.1 在字符串中存储文本 6.2 在程序中显示字符串 6.3 在字符串中使用特殊字符 6.4 拼接字符串 6.5 将其他变量用于字符串中 6.6 字符串的高级处理 6.6.1 比较两个字符串 6.6.2 确定字符串的长度 6.6.3 改变字符串的大小写 6.6.4 查找字符串 6.7 导演及演员名单 6.8 总结 6.9 问与答 6.10 测验 6.10.1 问题 6.10.2 答案 6.11 练习 第7章 使用条件测试进行判断 7.1 if语句 7.1.1 小于和大于的比较 7.1.2 相等和不等 7.1.3 使用块语句组织程序 7.2 if-else 语句 7.3 switch语句 7.4 条件运算符 7.5 观察时钟 7.6 总结 7.7 问与答 7.8 测验 7.8.1 问题 7.8.2 答案 7.9 练习 第8章 使用循环重复执行操作 8.1 for循环 8.2 while 循环 8.3 do-while 循环 8.4 退出循环 8.5 给循环命名 8.6 测试计算机的运行速度 8.7 总结 8.8 问与答 8.9 测验 8.9.1 问题 8.9.2 答案 8.10 练习 第9章 使用数组存储信息 9.1 创建数组 9.2 使用数组 9.3 多维数组 9.4 对数组进行排序 9.5 对字符串中的字符计数 9.6 总结 9.7 问与答 9.8 测验 9.8.1 问题 9.8.2 答案 9.9 练习 第10章 创建第一个对象 10.1 面向对象编程的工作原理 10.2 对象示例 10.3 什么是对象 10.4 理解继承 10.5 建立继承层次 10.6 转换对象和简单变量 10.6.1 简单变量的类型转换 10.6.2 对象类型转换 10.6.3 在简单变量和对象之间进行转换 10.6.4 自动封装和拆封 10.7 创建对象 10.8 总结 10.9 问与答 10.10 测验 10.10.1 问题 10.10.2 答案 10.11 练习 第11章 描述对象 11.1 创建变量 11.2 创建类变量 11.3 用方法来创建行为 11.3.1 声明方法 11.3.2 参数不同的类似方法 11.3.3 构造函数 11.3.4 类方法 11.3.5 方法中变量的作用域 11.4 将一个类放在另一个类中 11.5 使用关键字this 11.6 使用类方法和类变量 11.7 总结 11.8 问与答 11.9 测验 11.9.1 问题 11.9.2 答案 11.10 练习 第12章 充分利用现有对象 12.1 继承的威力 12.1.1 继承行为和属性 12.1.2 覆盖方法 12.2 建立继承 12.3 使用现有的对象 12.4 将相同类型的对象存储到 Vector 中 12.5 创建子类 12.6 总结 12.7 问与答 12.8 测验 12.8.1 问题 12.8.2 答案 12.9 练习 第13章 创建简单的用户界面 13.1 Swing 和抽象窗口工具包 13.2 使用组件 13.2.1 窗口和框架 13.2.2 按钮 13.2.3 标签和文本框 13.2.4 复选框 13.2.5 组合框 13.2.6 文本区域 13.2.7 面板 13.3 创建自己的组件 13.4 总结 13.5 问与答 13.6 测验 13.6.1 问题 13.6.2 答案 13.7 练习 第14章 用户界面的布局 14.1 使用布局管理器 14.1.1 GridLayout管理器 14.1.2 BorderLayout管理器 14.1.3 BoxLayout管理器 14.1.4 使用Insets将组件隔开 14.2 应用程序的界面布局 14.3 总结 14.4 问与答 14.5 测验 14.5.1 问题 14.5.2 答案 14.6 练习 第15章 响应用户输入 15.1 让程序监听 15.2 设置要监听的组件 15.3 处理用户事件 15.3.1 复选框和组合框事件 15.3.2 键盘事件 15.3.3 启用和禁用组件 15.4 完善图形应用程序 15.5 总结 15.6 问与答 15.7 测验 15.7.1 问题 15.7.2 答案 15.8 练习 第16章 创建复杂的用户界面 16.1 滚动窗格 16.2 滑块 16.3 变更监听器 16.4 使用图像图标和工具栏 16.5 总结 16.6 问与答 16.7 测验 16.7.1 问题 16.7.2 答案 16.8 练习 第17章 创建交互式Web程序 17.1 标准applet方法 17.1.1 在applet窗口中绘画 17.1.2 初始化applet 17.1.3 启动和停止applet 17.1.4 销毁applet 17.2 将applet放到Web页面中 17.3 创建applet 17.3.1 在applet窗口中绘画 17.3.2 测试SalutonApplet程序 17.4 从Web页面传递参数 17.5 在applet中接收参数 17.6 在applet中处理参数 17.7 使用object标记 17.8 总结 17.9 问与答 17.10 测验 17.10.1 问题 17.10.2 答案 17.11 练习 第18章 处理程序中的错误 18.1 异常 18.1.1 在try-catch块中捕获异常 18.1.2 捕获多种不同的异常 18.1.3 出现异常后进行处理 18.1.4 抛出异常 18.1.5 忽略异常 18.2 抛出和捕获异常 18.3 总结 18.4 问与答 18.5 测验 18.5.1 问题 18.5.2 答案 18.6 练习 第19章 创建线程程序 19.1 线程 19.1.1 降低程序的速度 19.1.2 创建线程 19.2 使用线程 19.2.1 声明类 19.2.2 创建变量 19.3 从init( )开始 19.4 在创建URL时捕获错误 19.5 在paint( )方法中处理屏幕更新 19.6 启动线程 19.6.1 运行线程 19.6.2 停止线程 19.7 处理鼠标单击 19.8 循环显示链接 19.9 总结 19.10 问与答 19.11 测验 19.11.1 问题 19.11.2 答案 19.12 练习 第20章 读写文件 20.1 流 20.1.1 文件 20.1.2 从流中读取数据 20.1.3 缓冲输入流 20.2 将数据写入流中 20.3 读写配置属性 20.4 总结 20.5 问与答 20.6 测验 20.6.1 问题 20.6.2 答案 20.7 练习 第21章 读写XML数据 21.1 创建XML文件 21.2 读取XML文件 21.3 读取 RSS 聚合内容(Syndication Feeds) 21.4 总结 21.5 问与答 21.6 测验 21.6.1 问题 21.6.2 答案 21.7 练习 第22章 利用JAX-WS开发Web服务 22.1 定义服务端点接口 使用注解来简化Java代码 22.2 创建服务实现Bean 22.3 发布Web服务 22.4 使用Web服务描述语言文件 22.5 创建Web服务客户端 22.6 总结 22.7 问与答 22.8 测验 22.8.1 问题 22.8.2 答案 22.9 练习 第23章 创建Java2D图形 23.1 使用Font类 23.2 使用Color类 23.3 创建自定义颜色 23.4 绘制直线和形状 23.4.1 绘制直线 23.4.2 绘制矩形 23.4.3 绘制椭圆和圆 23.4.4 绘制弧线 23.5 绘制饼图 23.6 总结 23.7 问与答 23.8 测验 23.8.1 问题 23.8.2 答案 23.9 练习 第24章 编写Android app 24.1 Android简介 24.2 创建 Android app 24.2.1 剖析一个Android新项目 24.2.2 创建app 24.2.3 安装Android模拟器 24.2.4 创建调试配置 24.3 运行app 24.4 设计真实的app 24.4.1 组织资源 24.4.2 配置app的Manifest文件 24.4.3 设计用户界面 24.4.4 编写Java代码 24.5 总结 24.6 问与答 24.7 测验 24.7.1 问题 24.7.2 答案 24.8 练习 附录A 使用NetBeans IDE A.1 安装NetBeans A.2 创建新项目 A.3 创建新的Java类 A.4 运行应用程序 A.5 修复错误 附录B Java资源 B.1 可以考虑的其他书 B.2 Oracle公司的 Java官方站点 B.3 其他Java站点 B.3.1 本书英文版的配套网站 B.3.2 Café au Lait B.3.3 Workbench B.3.4 Java 7 Developer Blog B.3.5 其他Java博客 B.3.6 InformIT B.3.7 Stack Overflow B.3.8 Java Review Service B.3.9 JavaWorld杂志 B.3.10 Developer.com’s Java Directory 附录C 本书站点 附录D 设置Android开发环境 D.1 起步 D.2 安装Eclipse D.3 安装 Android SDK D.4 安装在Eclipse中使用的Android插件 D.5 设置你的手机 其他 版权

Java初级教程

Java入门经典
第14章 用户界面的布局

本章介绍如下内容:

创建布局管理器;

为容器指定布局管理器;

使用面板来组织界面中的组件;

使用不常见的布局;

为Java应用程序创建原型。

开始为Java程序设计图形用户界面时,面临的一个障碍是组件会移动。容器大小发生变化时(如用户调整框架的大小时),容器中的组件将根据容器的新尺寸重新排列。

这种变化对程序员有利,因为它考虑到了界面组件在不同操作系统中的显示方式。对于同一个Java程序,可单击的按钮在Windows、Linux和Mac操作系统中的外观可能不同。

使用一组称为布局管理器的类来排列界面中的组件,这些类定义了组件如何在容器中显示。界面中的每个容器都有自己的布局管理器。

14.1 使用布局管理器

在Java中,组件在容器中的位置取决于其他组件的大小以及容器的宽度和高度。下列因素将影响按钮、文本框和其他组件的布局:

容器的大小;

其他组件和容器的大小;

使用的布局管理器。

可使用几种布局管理器来影响组件的显示。面板的默认布局管理器是FlowLayout类,前一章使用的就是它,它位于java.awt包中。

使用FlowLayout时,像在页面中排列英文单词那样排列组件:从左到右排列,当前行没有空间后进入下一行。

当框架中添加近组件时,它可以使用如下代码示例来调用浮动的布局:

也可以指定用于特定容器(如JPanel对象)的布局管理器,为此可以使用该容器对象的setLayout( )方法。

创建一个新的Java空文件,将其命名为Crisis,然后输入程序清单14.1中的全部文本,并保存。该应用程序的图形用户界面包含5个按钮。

程序清单14.1 Crisis.java程序的完整源代码

图14.1所示为该应用程序的运行结果。

图14.1 使用浮动布来排列组件

FlowLayout类仅根据容器的尺寸来排列组件。调整应用程序窗口的大小时,组件将立刻重新排列。将窗口的宽度增大到原来的两倍,将发现所有JButton组件都显示在同一行。

14.1.1 GridLayout管理器

GridLayout类位于java.awt包中,它将容器中所有的组件组织为指定的行数和列数。分配给每个组件的显示区域都相同,因此如果指定3行3列的网格,容器将被划分成9个大小相等的区域。

当组件加入到容器中时,GridLayout将所有的组件放置到网格中的某个位置,而且组件是从左向右依次添加,当这一行满了之后,在从下一行的最左边开始添加。

下面的语句创建一个容器,并将其设置为使用网格布局,该网格为2行3列:

图14.2显示了使用网格布局时,应用程序Crisis的外观。

图14.2 使用网格布局排列组件

在图14.2中,有些标签显示的文本被截短。如果组件容纳不下标签文本,将使用省略号(…)表示省略的文本。

14.1.2 BorderLayout管理器

BorderLayout类它也位于java.awt包中,它将容器中的组件放置在特定的位置,该位置有5个方位:东、西、南、北、中。

BorderLayout管理器将组件放置到5个位置:其中4个位置由罗盘方向(compass direction)指定,另外一个由中心区域指定。当在该布局下添加组件时,add( )方法会包含第 2 个参数,用于指示组件应该放置的位置。该参数应该是BorderLayout类的5个类变量之一:NORTH、SOUTH、EAST、WEST和CENTER。

与GridLayout类相同,BorderLayout也会将所有可用空间都分配给组件。在周围放置4个边界组件后,余下的空间都分配给中央的组件,因此它通常是最大的。

下面的语句创建一个使用边界布局的容器:

图14.3是使用这种布局时应用程序Crisis的外观。

图14.3 使用边界布局排列组件

14.1.3 BoxLayout管理器

另一种方便的布局管理器是BoxLayout,它位于javax.swing包中,它可以将组件排列成一行或一列。

使用该布局时,先创建一个放置组件的面板,然后再创建一个布局管理器,它带有2个参数:

以框式布局(box layout)组织的组件;

BoxLayout.Y_AXIS指定垂直排列,BoxLayout.X_AXIS指定水平排列。

下面是用于在应用程序Crisis中排列组件的代码:

图14.4显示了组件的排列情况。

图14.4 使用框式布局排列组件

14.1.4 使用Insets将组件隔开

在容器中排列组件时,可以使用Insets令组件远离容器边缘,Insets是代表容器边界区域的对象。

Insets类位于java.awt包中,它有一个接受4个参数的构造函数:在容器上、下、左、右留出的空间。每个参数都以像素为单位,像素是定义框架大小时使用的度量单位。

下面的语句创建一个Insets对象:

around对象代表容器的边界:上边缘内10像素、左边缘内6像素、下边缘内10像素、右边缘内3像素。

要想在容器中使用 Insets 对象,必须覆盖容器的 getInsets( )方法。该方法不接受任何参数,并返回一个Insets对象,如下例所示:

图14.5说明了这对前一个示例的影响,后者使用BorderLayout布局管理器,界面如图14.1所示。

图14.5 使用Insets增大组件周围的空间

在图14.5所示的容器中,左边框为15像素,下边框为10像素,右边框为15像素,上边框为50像素。

注意:

JFrame容器有内置的Inset,用于为标题栏留出空间。当覆盖getInsets( )方法时并设置自定义值时,过小的inset将导致容器将组件显示在标题栏下面。

14.2 应用程序的界面布局

到目前为止,布局管理器应用于整个框架:调用框架的 setLayout( )方法,所有组件遵循相同的规则。这适用于有些程序,但使用Swing开发图形用户界面时,将经常发现这些布局管理器都不合适。

解决这种问题的方法之一是,将一组JPanel对象作为容器,用于放置图形用户界面的不同部分。对于其中每部分,可以使用 JPanel 对象的 setLayout( )方法设置不同的布局规则。这些面板包含需要包含的组件后,就可以将这些面板直接加入到框架中。

接下来将开发一个完整的界面,该界面可以用于你在下一章编写的程序。该程序是一个猜数游戏,确定用户一生中赢得数百万大奖的机会。它不断随机生成6个数,直到用户选择的数字与摇出的数字相同。图14.6是要开发的应用程序GUI。

图14.6 显示应用程序 Lotto Madness 的图形用户界面

创建一个新的Java空文件,将其命名为LottoMadness,然后输入程序清单14.2中的所有文本,并保存。

程序清单14.2 LottoMadness.java的完整源代码

尽管现在还没有在该程序中添加任何语句,让其执行某些工作,但是现在也可以运行该程序,来确定图形界面的布置是否正确,是否可以收集所需要的信息。

该应用程序使用了几种不同的布局管理器。为更清楚应用程序用户界面的布局,请看图14.7。该界面分成4排,各排间用水平黑线分隔。每行都是一个JPanel对象,应用程序使用GridLayout布局管理器将它们组织成4行1列。

图14.7 将LottoMadness应用程序划分为不同的面板

在各排中,使用不同的布局管理器来排列组件,第1排和第3排使用FlowLayout对象,程序的第45~46行说明这些对象如何创建的:

在 FlowLayout( )构造函数中使用了 3 个参数。第一个参数是 FlowLayout.CENTER,指定组件应在容器(它们所属的 JPanel)中居中。后面两个参数指定组件之间的水平间距和垂直间距,分别为10像素。

界面的第 2 排被设置为 2 行 7 列宽的网格。在 GridLayout( )构造函数中,也将组件之间的水平距离和垂直距离指定为10像素。程序的第53~54行设置了该网格:

界面的第4排使用GirdLayout将组件组织成2行3列的网格。

应用程序LottoMadness 使用了本章介绍的多种组件。程序代码第7~35 行创建界面中所有的组件对象。首先创建用于当前排的JPanel对象,然后创建这排中的组件。这段代码创建了所有的组件和容器,但调用 add( )方法将它们加入到应用程序的主框架中之前,这些组件和容器不会显示出来。

第 45~96 行添加组件。第 45~52 行是构造函数 LottoMadness( ):

创建完布局管理器对象后,将其作为对应 JPanel 对象(这里为 row1)的 setLayout( )方法的参数。指定布局后,使用 add( )方法将组件加入到 JPanel 中。放置好所有的组件后,调用 rowl 对象的 add( )方法,将 rowl 对象加入到框架中。

14.3 总结

当第一次设计Java程序的图形用户界面时,可能不相信组件能够移动是优点。布局管理器提供了开发引人入胜的图形用户界面的途径,它足够灵活,能够应对不同的显示方式。

下一章将更详细地介绍图形用户界面,将LottoMadness界面用于摇号,确定中奖号码。

14.4 问与答

问:在LottoMadness应用程序中,为何有些文本框为灰色,而其他文本框为白色?

答:使用 setEditable( )方法将有些文本框设置为不能编辑的,因此是灰色的。文本框的默认行为是,允许用户在文本框内单击并输入来修改文本框的值。然而有些文本框只是用来显示信息而不是接收用户输入。SetEditable( )方法可禁止用户修改不允许修改的文本框。

14.5 测验

通过回答下列问题可以检测对Java布局管理器的理解程度。

14.5.1 问题

1.当将界面分成几个使用不同布局管理器的部分,通常使用下面哪种容器?

a.JWindow。

b.JPanel。

c.Container。

2.面板的默认布局管理器是什么?

a.FlowLayout。

b.GridLayout。

c.没有默认布局管理器。

3.BorderLayout类因什么而得名?

a.每个组件的边界。

b.组件沿容器边界的排列方式。

c.Java的开发者随便取的。

14.5.2 答案

1.b.JPanel是最简单的容器。

2.a.面板默认使用浮动布局,但框架和窗口默认使用网格布局。

3.b.将组件加入到容器中时,必须使用BorderLayout.WEST和BorderLayout.EAST等方向变量指定其位置。

14.6 练习

如果你想继续深入了解流程(网格和边界)布局,请完成下面的实际操作部分:

修改应用程序Crisis,使用一种布局管理器来组织对象panic和dontPanic,使用另一种布局管理器来组织其他3个按钮。

复制文件LottoMadness.java,然后将其重命名为NewMadness.java。修改该程序,将quick pick和personal choice 作为组合框,将按钮 start、stop 和 reset 改为复选框。

有关为完成这些练习而编写的Java程序,请访问本书的配套网站www.java24hours.com。

没有精选讨论主题。

全部讨论主题 查看精选主题

没有讨论主题。
😃 😅 😆 😁 😂 😊 😄 😠 😩 😲 😞 😵 😰 😒 😍 😤 😜 😝 😋 😘 😚 😷 😳 😢 😭 😨 😣 😡 😌 😖 😔 😱 😪 😏 😓 😥 😫 😉 👊 👍 👆 👇 👈 👉 👋 👏 👌 👎 👐 💓 💔 💕 💖 💗 💘 💙 💚 💛 💜 💝 💞 💟