gpt4 book ai didi

Javafx 如何绑定(bind)到属性列表

转载 作者:行者123 更新时间:2023-12-05 08:55:21 27 4
gpt4 key购买 nike

我想根据节点的宽度对随机数量的节点进行排序。但是我无法计算宽度的总和(使用它们的属性),我有以下示例代码 - 我无法获悉其中一个属性的更改:

@Override
public void start(Stage arg0) throws Exception {
List<SimpleIntegerProperty> l = IntStream.range(0, 10)
.mapToObj(SimpleIntegerProperty::new)
.collect(Collectors.toList());
ObservableList<IntegerProperty> widthAr = FXCollections.observableArrayList();
widthAr.addAll(l);

IntegerBinding nextheight = Bindings.createIntegerBinding(() -> widthAr.stream()
.mapToInt(IntegerProperty::get)
.sum(), widthAr);

nextheight.addListener((v, o, n) -> System.out.println("New value: " + v.getValue()));

//Now change randomly one of the IntegerProperties
ScheduledExecutorService tfsqueryScheduler = Executors.newScheduledThreadPool(1);

tfsqueryScheduler.scheduleAtFixedRate(() -> {
System.out.println("Changing");
int i = (int) Math.round(Math.random() * 9.4);
SimpleIntegerProperty v = l.get(i);
v.set(0);
}, 0, 3, TimeUnit.SECONDS);

System.out.println("Start...");
}

永远不会调用 nextheight.addListener :( ... 有什么想法吗?谢谢!

最佳答案

默认情况下,ObservableList 仅在列表结构发生变化时触发更新(例如,项目被添加到列表或从列表中删除),如果列表中单个元素的状态发生变化则不会。要创建一个在属于其任何元素的属性更改时触发通知的列表,您需要使用 extractor 创建列表。 .

在这种情况下,您感兴趣的属性只是列表元素本身,因此您需要替换

ObservableList<IntegerProperty> widthAr = FXCollections.observableArrayList();

ObservableList<IntegerProperty> widthAr = 
FXCollections.observableArrayList(w -> new Observable[] {w});

另请注意,根据您的实际用例,您可能需要通过将其设为字段而不是局部变量来确保您的绑定(bind)不会过早被垃圾回收。

关于Javafx 如何绑定(bind)到属性列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46300540/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com