ObservableList  可观察的List,可以监听

  1. List排列顺序改变
  2. List中的数据发生改变(数据更新)
  3. List的数据添加及删除(数据新增或删除)

我自己的理解就是,类似于ajax的无刷新界面。因为你这个list跟前台界面绑定了,要是之前,你要重新绑定一下,然后刷新界面。现在有了这个类,就无需刷新界面,它会自动监听相关list进行事件处理。

 

1.排列更新监听

顺序排列更新,对应的change.wasPermutated(),其返回值为boolean值,当ObservableList的顺序发生变化(即进行了排序操作),此方法就会返回为true

fun main() {
    val observableList = observableListOf(0,1,2,3)
    println(observableList)
    observableList.onChange { change ->
        while (change.next()) {
            when {
                change.wasPermutated() -> println("permutated (${change.from} ,${change.to})")
                
                change.wasReplaced() -> println("replace (${change.from} ,${change.to})")
                else -> {
                    when {
                        change.wasAdded() -> println("add (${change.from} ,${change.to})")
                        change.wasRemoved() -> println("remove (${change.from} ,${change.to})")
                        change.wasUpdated() -> println("update (${change.from} ,${change.to})")
                    }
                }
            }
        }
    }
    observableList.sortBy { it }
    println(observableList)
    observableList.sortByDescending { it }
    println(observableList)
}

对应的输出结果为:

[0, 1, 2, 3]  //源数组
permutated (0 ,4) //回调监听器中的方法
[0, 1, 2, 3] //升序排列
permutated (0 ,4) 
[3, 2, 1, 0] //降序排列

2.数据更新监听(replace)

这里大家可能会有点疑惑,最上面的代码不是有个wasUpdated()方法吗,这里怎么标的是replace?

我自己研究的时候,也是很奇怪...官方的那个wasUpdated()方法没有找到对应的回调方式,照理说我更新了数组中的一个数据,这个wasUpdated()应该返回的是true,但是实际测试的时候根本没有,反而是wasReplaced()返回了true

//上面省略相关代码...
//JavaFx对应是set(index,element)方法
observableList[1] = 12 //下标为1的对象更新为12
println(observableList)

输出结果:

[0, 1, 2, 3]
replace (1 ,2)
[0, 12, 2, 3]

3.数据添加与删除监听(add remove)

数据添加和删除就和上面同理了,当我们调用add()(包括addAll())和remove()方法,对应的wasAdd()wasRemove()方法就会返回true

另外,ObservableList提供了两个List供我们拿到添加的数据和移除的数据

  • change.addedSubList 新增的数据列表
  • change.removed 被移除的数据列表

 

文章参考:JavaFx ObservableList的使用详解 - Stars-one - 博客园 (cnblogs.com)

posted on 2023-09-06 11:04  孤独斗士  阅读(105)  评论(0编辑  收藏  举报