DOC-12-01 使用JavaFX集合

这篇教程介绍了JavaFX集合API——Java集合框架(Java Collections Framework)的一个扩展,提供了可以编译和运行的代码样例。

教程开篇简短介绍了Java集合框架的相关类和接口,然后解释了JavaFX集合API如何扩展了这些类和接口并提供了额外的功能。想要深入了解Java集合,请参考Java教程的集合相关部分

回顾Java集合基础知识

这一小节总结了java.util.List和java.util.Map接口和java.util.Collections类。如果你对Java集合比较熟悉,可以直接跳至下一节“学习JavaFX集合”。

列表(List)

List是一个对象的有序集合,由java.util.List接口来表示。List中的对象称为其元素(elements),同一个List中可以存在重复元素。List接口定义了一些有用的方法,可以添加元素、访问或改变特定元素、创建子列表、查询列表中的元素、清除列表等等。

例1-1 通过一个字符串对象列表对这些方法进行了说明

例1-1 使用列表

例1-1的输出如下:

Creating the List...

Size: 3

String one

String two

String three

Setting an element...

Size: 3

A new String

String two

String three

Searching for content...

Contains "A new String"? true

Creating a sublist...

Size: 2

String two

String three

Clearing all elements...

Size: 0

此程序先初始化了一个ArrayList(List接口的一个具体实现)并指定给list变量。然后使用add方法在其中加入了三个String对象。(在程序执行过程中,通过调用自定义的名为printElements的private static方法,程序可以输出元素信息)。list.set(0,”A new String”)语句用新的String对象替换了第一个索引位置的原始String对象。contains方法可以知道当前List中是否存在特定的元素,sublist方法返回指定下标范围的一个新List。最后,clear方法清除了List中的所有元素。

映射(Map)

Map是一个进行键值对映射的对象。一个Map不能包含重复的键,每个键仅能映射一个值。你可以在Map中添加键和值,然后通过遍历其键来检索获取对应的值。例如通过键apple可能返回fruit,而carrot可能返回vegetable。

例1-2 通过一个String对象的Map展示了这些方法。

例1-2 使用Map

例1-2的输出如下:

Size: 2

Empty? false

Passing in keys and printing out values...

Key is apple, value is: fruit

Key is carrot, value is: vegetable

Inspecting keys and values:

Contains key "apple"? true

Contains key "carrot"? true

Contains key "fruit"? false

Contains key "vegetable"? false

Contains value "apple"? false

Contains value "carrot"? false

Contains value "fruit"? true

Contains value "vegetable"? true

Removing apple from the map...

Size: 1

Contains key "apple"? false

Invoking map.clear()...

Size: 0

此程序开始实例化了一个HashMap对象(Map接口的一个具体实现)并将其分配给了map变量。然后使用put方法在map中添加了键值对。然后通过调用size()和isEmpty()方法获取(并输出)了一些Map的信息。程序中同样介绍了如何通过指定的键获取值(例如map.get(“apple”)返回了值fruit)。containsKey和containsValue方法展示了如何检测一个特定的键或者值是否存在,clear方法清除了所有的键值映射。

集合(Collections)

除了List和Map中的方法外,Collections类暴露了一些静态工具类方法,它们可以操作或返回集合。例1-3通过创建一个List,然后使用Collections类反转、交换并排序其中的元素来展现了对应的一些方法。

例1-3 使用Collections

例1-3的输出如下:

Creating the list...

a

b

c

d

Reversing the elements...

d

c

b

a

Swapping the elements around...

b

c

a

d

Alphabetically sorting the elements...

a

b

c

d

此程序首先在List中加入了字母a、b、c和d(同样使用ArrayList作为具体实现)。然后调用Collections.reverse(list)方法反转了列表中的元素。调用Collections.swap方法交换List中的元素(例如Collections.swap(list,0,3)交换了下标为0和3的元素)。最后Collections.sort()方法按字母顺序对元素进行了排序。

回顾完了Java集合框架的相关的大多数内容之后,你现在可以开始学习在JavaFX中怎样使用集合了。

学习JavaFX集合

JavaFX集合由javafx.collections包定义,它由以下接口和类组成:

接口

ObservableList:一种可以使用监听器(Listener)在发生改变时进行追踪的列表

ListChangeListener:一种可以接收ObservableList的改变通知的接口

ObservableMap:一种可以使用观察者(Observer)在发生改变时进行追踪改变的映射

MapChangeListener:一种可以接收ObservableMap的改变通知的接口

FXCollections:一个工具类,其中包含了一些静态方法,它们与java.util.Collections中的方法一一对应

ListChangeListener.Change:代表ObservableList中的改变

MapChangeListener.Change:代表ObservableMap中的改变

下一节解释了如何使用这些接口和类

使用ObservableList,ObservableMap和FXCollections

javafx.collections.ObservableList和javafx.collections.ObservableMap接口都继承了javafx.beans.Observable(也分别继承了java.util.List或java.util.Map),提供了一个支持可观察性的List或Map。如果查看这些接口的具体API说明,就会发现添加或删除对应监听器的方法(ObservableList中的ListChangeListener, 以及 ObservableMap中的MapChangeListener)。不像前面的List和Map的例子那样,而是使用ArrayList和HashMap作为具体实现——例1-4中使用javafx.collections.FXCollections类来创建并返回ObservableList和ObservableMap对象。

例1-4 使用ObservableList

在例1-4中,首先创建了一个标准的List,然后用ObservableList对其进行了包装,获取包装后的ObservableList的方法是使用FXCollections.observableList(list)方法并传入对应的列表。然后注册了一个ListChangeListener,这样就可以在ObservableList发生改变时获取通知。

你可以使用类似的方法监听ObservableMap,如例1-5所示。

例1-5 使用ObservableMap

最后,你可以使用Collections或FXCollections中的静态工具方法(例如反转一个列表中的元素)。但是要记住,当FXCollections的方法被调用时,它将会产生最少的改变通知数量(通常是1个)。而在另一方面,在调用Collections的方法时则可能会得到多个改变通知,如例1-6所示。

例1-6 Collections和FXCollections的改变通知对比

在例1-6中,代码行FXCollections.sort(obervableList)将列表中的String对象按字母顺序进行排序,并在屏幕上仅输出了一个改变通知;如果使用Collections.sort(observableList),则改变通知将会输出四次。

当使用ListChangeListener或MapChangeListener时,onChange方法总是会带有一个封装了改变信息的对象参数。这是一个ListChangeListener.Change (与ObservableList对应) 或MapChangeListener.Change (与ObservableMap对应)实例。以使用ListChangeListener.Change为例,通过循环调用change.next()方法可以访问所有改变对象,如例1-7所示。

例1-7 查询一个ListChangeListener.Change对象

例1-7调用了ListChangeListener.Change对象的多个方法。重点要记住ListChangeListener.Change对象可以包含多个改变,因此必须在while循环中调用next()方法对其进行迭代遍历。但是注意MapChangeListener.Change对象中仅包括一个改变,对应表示put或remove操作的发生。

欲知可用方法的更多信息,请查看ListChangeListener.ChangeMapChangeListener.Change的API文档。

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2015/09/javafx-collections/
百度已收录