附加的swing小部件(下)
JOptionPane
JOptionPane 是在 Swing中类似“快捷方式”的东西。通常,作为UI开发人员,您需要向用户呈现快速信息,让用户了解错误和信息。甚至可能想得到一些快速数据,例如名称或数字。在Swing中,JOptionPane 类为这些东西提供了快捷方式,但这并不是它必须完成的任务。不需要让每个开发人员重头开始重复相同的工作,Swing已经提供了这个基本的但很有用的类,为UI开发人员提供了获取和接收简单消息的简易方法。
使用 JOptionPane时有点麻烦的是可以使用的全部选项。虽然简单,但是它仍然提供了大量选项,这些选项有可能造成混淆。学习JOptionPane的最好方法就是使用它;编写代码,观察弹出的是什么。这个组件几乎可以让您修改它的每一方面:帧标题、消息本身、显示的图标、按钮选项,以及是否需要文本响应。因为有太多的可能性,无法在本教程中一一列举它们,所以您最好是访问JOptionPane的API页面,查看它的众多可能性。
JTextArea
JTextArea 比JTextField更进了一步。JTextField被局限在一行文本中,而JTextArea扩展了这个能力,支持多行文本。可以把它想像成一个空白页,您可以在其中的任意地方进行输入。正如您可能猜到的,JTextArea包含许多与JTextField相同的功能,毕竟,它们实际上是相同的组件。但是JTextArea提供了一些额外的重要功能,可以把它区别开。这些功能包括单词自动换行的能力(即把长文本自动换行到下一行,而不是将单词从中断开)、对文本自动换行的能力(即把长的文本行移动到下一行,而不是创建一个需要水平滚动条的非常长的行)。
支持行和单词的自动换行的重要方法是:
· is/setLineWrap():设置在行过长的时候是否要自动换行。
· is/setWrapStyleWord():设置在单词过长的时候是否要把长单词移到下一行。
JScrollPane
上面的示例构造完成之后,假设 JTextArea包含太多文本,而给定的空间中容纳不下,那这该怎么办?如果您以为会自动出现滚动条,那么很不幸,您错了。JScrollPane添补了这个空白,为Swing组件提供了处理所有与滚动条相关的动作。所以虽然为每个需要的组件提供滚动块可能有些痛苦,但是一旦添加了它,它就会自动处理每件事,包括在需要的时候隐藏/显示滚动条。
除了用需要自动换行的组件创建 JScrollPane之外,不必直接处理它。根据上面的示例,用JTextArea调用JScrollPane的构造函数,这为JTextArea创建了在文本过长时滚动的能力:
JScrollPane scroll = new JScrollPane(getTextArea()); add(scroll);
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 中有许多处理数据的函数,而且根据我的说法,这些也只不过是使用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中进行选择时会有不同的方式,例如列、行或者一个单元格。
最后,JTable的大多数函数都超出本教程的范围;“中级 Swing”会深入这个复杂组件的更多细节。
JTree
JTree 是另外一个复杂组件,它不像JTable那样难用,但是也不像JList那么容易。使用JTree时麻烦的部分是它要求的数据模型。
JTree 的功能来自树的概念,树有分支和叶子。您在Windows中使用IE浏览器时,可能非常熟悉这个概念——可以展开和折叠分支,显示可以选择和取消选择的不同叶子。
您很有可能发现树在应用程序中不像表格或列表那样有用,所以在 Internet上没有许多有帮助的这方面的示例。实际上,像JTable一样,JTree没有什么入门级的功能。如果决定使用JTree,那么立即就可以达到中级水平,当然还必须学习随之而来的概念。因此,示例应用程序没有介绍JTree,所以也很不幸,不管是入门教程还是中级教程,都没有涉及这个不太流行的组件。
但是,树有一些时候是符合需求的合理的 UI组件。文件/目录系统就是一个示例(就像在IE浏览器中那样),而且当数据采取层次结构的时候,也就是说数据采用树的形式的时候,JTree就是最佳组件。