FilteredList/SortedList
Martin Sladecek
martin.sladecek at oracle.com
Thu Jan 17 01:01:54 PST 2013
On 01/16/2013 10:35 PM, Bruce Alspaugh wrote:
> Sorry if I'm a little late to this discussion since I am still very new
> to JavaFX. Have you taken a look at the approach to ObservableLists
> that the Glazed Lists project takes?
Yes. :-)
As Richard Bair already wrote, the popularity of Glazed Lists in Swing
was one of the reasons why we want to have similar approach in FX.
>
> An issue I see with the TransformationList is that it only provides
> sorting and filtering transformations. In general, you could have many
> other types of arbitrary list transformations. Those transformations
> could depend on multiple ObservableLists or scalar ObservableValues.
> See Glazed Lists for more examples of powerful list transformations.
8.0 will contain only sorting and filtering implementations of
TransformationList (or maybe more, serving for TableView et al.
purposes). But this might change in later releases. Also, anybody will
have a chance to implement it's own TransformationList (by subclassing
TransformationList), but these TransformationLists will have to be
created through some constructor, not directly through a ObservableList
method.
>
> Why not just implement SortedList and FilterList as concrete subclasses
> of ListBinding that are bound to their source ObservableList and an
> observable Comparator or predicate? For convenience, you could provide
> sort and filter methods to ListExpression that take the appropriate
> observable Comparator or predicate and return another sorted or filtered
> ListExpression so you can chain the calls and build a transformation
> pipeline?
Good question actually!
The main purpose of TransformationList is to provide models for controls
like ListView or TableView. These models can be anything that implements
ObservableList (which ListBinding does). But having to put a binding as
a model or bind a Property<ObservableList> on some control will probably
be an overkill. The bindings are tightly related to
ObservableValues/Properties, which means there's one extra layer of
observability. It's not just the list we'd observe with ListBinding, but
also changes to the reference to the list itself. Means one extra
wrapper for every model.
However, I will explore how the TransformationLists will work with
ListExpression or how we could integrate them.
>
> This makes it possible to add more methods to ListExpression to provide
> more types of list transformations in the future without breaking
> anything, and end users can build their own custom transformations
> simply by providing a concrete implementation of ListBinding and binding
> to the appropriate dependencies.
The same with TransformationList class and new (defender) methods on
ObservableList. :-)
>
> I haven't had a chance to study the TableView API closely, but you may
> be thinking you need a special interface on SortedList so that TableView
> can change the Comparator on it when the user wants to change the sort
> order. Is that really true? Why can't TableView simply make it's
> Comparator properties observable and not be responsible for sorting the
> list at all? You could provide a convenient TableComparatorChooser that
> registers itself as a listener that responses to changes in the
> TableView comparators by updating the observable sort Comparator the
> SortedList is bound to appropriately. This borrows some ideas from the
> Glazed Lists approach to sorting a table.
>
> Bruce
-Martin
More information about the openjfx-dev
mailing list