swing入门教程(四) 附加的swing小部件(下)

来源:互联网 发布:linux编译android程序 编辑:程序博客网 时间:2024/04/28 05:09

 JOptionPane

JOptionPane 是在 Swing 中类似“快捷方式”的东西。通常,作为 UI 开发人员,您需要向用户呈现快速信息,让用户了解错误和信息。甚至可能想得到一些快速数据,例如名称或数字。在 Swing 中,JOptionPane 类为这些东西提供了快捷方式,但这并不是它必须完成的任务。不需要让每个开发人员重头开始重复相同的工作,Swing 已经提供了这个基本的但很有用的类,为 UI 开发人员提供了获取和接收简单消息的简易方法。

以下是一个 JOptionPane:

JOptionPane
JOptionPane

使用 JOptionPane 时有点麻烦的是可以使用的全部选项。虽然简单,但是它仍然提供了大量选项,这些选项有可能造成混淆。学习 JOptionPane 的最好方法就是使用它;编写代码,观察弹出的是什么。这个组件几乎可以让您修改它的每一方面:帧标题、消息本身、显示的图标、按钮选项,以及是否需要文本响应。因为有太多的可能性,无法在本教程中一一列举它们,所以您最好是访问 JOptionPane 的 API 页面,查看它的众多可能性。

 JTextArea

JTextArea 比 JTextField 更进了一步。JTextField 被局限在一行文本中,而 JTextArea 扩展了这个能力,支持多行文本。可以把它想像成一个空白页,您可以在其中的任意地方进行输入。正如您可能猜到的,JTextArea 包含许多与 JTextField 相同的功能,毕竟,它们实际上是相同的组件。但是 JTextArea 提供了一些额外的重要功能,可以把它区别开。这些功能包括单词自动换行的能力(即把长文本自动换行到下一行,而不是将单词从中断开)、对文本自动换行的能力(即把长的文本行移动到下一行,而不是创建一个需要水平滚动条的非常长的行)。

Swing 中的 JTextArea 看起来就像您期望的那样:

A JTextArea
JTextArea

支持行和单词的自动换行的重要方法是:

  • is/setLineWrap()设置在行过长的时候是否要自动换行。
  • is/setWrapStyleWord()设置在单词过长的时候是否要把长单词移到下一行。

 JScrollPane

上面的示例构造完成之后,假设 JTextArea 包含太多文本,而给定的空间中容纳不下,那这该怎么办?如果您以为会自动出现滚动条,那么很不幸,您错了。JScrollPane 添补了这个空白,为 Swing 组件提供了处理所有与滚动条相关的动作。所以虽然为每个需要的组件提供滚动块可能有些痛苦,但是一旦添加了它,它就会自动处理每件事,包括在需要的时候隐藏/显示滚动条。

除了用需要自动换行的组件创建 JScrollPane 之外,不必直接处理它。根据上面的示例,用 JTextArea 调用 JScrollPane 的构造函数,这为 JTextArea 创建了在文本过长时滚动的能力:

   JScrollPane scroll = new JScrollPane(getTextArea());   add(scroll);

更新后的示例看起来如下所示:

JScrollPane 示例
JScrollPane

JScrollPane 也公开了它将创建的两个 JScrollBar。这些 JScrollBar 组件也包含一些方法,可以用这些方法来修改组件的行为(虽然它们不在本教程的范围之内)。

使用 JScrollPane 需要的方法是:

  • getHorizontalScrollBar()返回水平的 JScrollBar 组件。
  • getVerticalScrollBar():返回垂直的 JScrollBar 组件.
  • get/setHorizontalScrollBarPolicy()这个“策略”可以是以下三个之一:Always、Never 或 As Needed。
  • get/setVerticalScrollBarPolicy()与水平函数相同。

JList

JList 是一个有用的组件,用于向用户呈现许多选择。可以把它当作 JComboBox 的扩展。JList 提供了更多选择,并添加了多选的能力。在 JList 与 JComboBox 之间进行选择通常取决于以下两个特性:如果需要多选,或者选择的选项超过 15 个(虽然这个数字并不是通用规则),那么就应当选择 JList。

应用将 JList 与 JScrollPane 结合使用,就像上面演示的那样,因为它能够呈现比它的空间所能容纳的更多的选项。

JList 包含选择模型的概念(在 JTable 中也会看到),在这里,可以设置 JList 接受不同类型的选择。这些类型是:单一选择(只能选择一项)、单一间隔选择(只能选择相邻选项),以及任意多项或者多项间隔选择(可以选择任意数量、任意组合的选择)。

JList 是第一个我称为 “复杂组件” 的组件,该复杂组件还包含 JTable 和 JTree,它们支持大量的定制变化,其中包括改变 UI 的表现方式、处理数据的方式。因为本教程只是想介绍基础知识,所以我不想深入这些更高级的功能,但是在使用这些组件时有件事需要记住 —— 它们带来的挑战要比目前为止介绍过的所有组件都大。

JList 在 Swing 中看起来如下所示:

JList
JList

JList 中有许多处理数据的函数,而且根据我的说法,这些也只不过是使用 JList 的细节的皮毛而已。以下是一些基本方法:

  • get/setSelectedIndex()获取/设置列表中选中的行;在多选择列表的情况下,返回一个 int[]
  • get/setSelectionMode()与上面解释的一样,获取/设置选择模式,模式有:单一、单一间隔和多选间隔。
  • setListData()设置在 JList 中使用的数据。
  • get/setSelectedValue()获得选中的对象(与选中行号对应)。

 JTable

在考虑 JTable 时,请想像一下一个 Excel 工作表,这样就可以对 JTable 在 Swing 中的作用有一个清晰的印象。它与工作表共享许多相同的特征:单元格、行、列、移动列、隐藏列等。JTable 把 JList 的想法更进了一步。它不是在一列中显示数据,而是在多列中显示数据。让我们以人为例。JList 只能显示人的一个属性 —— 例如他或她的名字。而 JTable 就能够显示多个属性 —— 名字、年龄、地址,等等。JTable 是支持提供数据的大多数信息的 Swing 组件。

不幸的是,作为代价,JTable 也是最难对付的 Swing 组件。许多 UI 开发人员都为了学习 JTable 的每个细节而头痛。在这里,我希望我把能把您解救出来,只用您的 JTable 知识处理问题。

许多 JList 中的概念也扩展到了 JTable,其中包括不同的选择间隔的概念。但是 JList 中一列的概念变成了 JTable 的单元格的概念。这意味着在 JTable 中进行选择时会有不同的方式,例如列、行或者一个单元格。

在 Swing 中,JTable 看起来如下所示:

JTable
JTable

最后,JTable 的大多数函数都超出本教程的范围;“中级 Swing”会深入这个复杂组件的更多细节。

 JTree

JTree 是另外一个复杂组件,它不像 JTable 那样难用,但是也不像 JList 那么容易。使用 JTree 时麻烦的部分是它要求的数据模型。

JTree 的功能来自树的概念,树有分支和叶子。您在 Windows 中使用 IE 浏览器时,可能非常熟悉这个概念 —— 可以展开和折叠分支,显示可以选择和取消选择的不同叶子。

您很有可能发现树在应用程序中不像表格或列表那样有用,所以在 Internet 上没有许多有帮助的这方面的示例。实际上,像 JTable 一样,JTree 没有什么入门级的功能。如果决定使用 JTree,那么立即就可以达到中级水平,当然还必须学习随之而来的概念。因此,示例应用程序没有介绍 JTree,所以也很不幸,不管是入门教程还是中级教程,都没有涉及这个不太流行的组件。

但是,树有一些时候是符合需求的合理的 UI 组件。文件/目录系统就是一个示例(就像在 IE 浏览器中那样),而且当数据采取层次结构的时候,也就是说数据采用树的形式的时候,JTree 就是最佳组件。

在 Swing 中,JTree 看起来如下所示:

JTree
JTree