gpt4 book ai didi

JavaFx:将列表中元素的索引绑定(bind)到元素的属性

转载 作者:行者123 更新时间:2023-11-30 02:08:17 26 4
gpt4 key购买 nike

我有一个ObservableList<Model>其中模型有 IntegerProperty我想将该元素在丢失中的位置(索引)绑定(bind)到此 IntegerProperty 。因此,如果我移动该列表中的元素,我也想更改属性。

我发现了一个类似的问题,但我不知道为什么它的答案被接受,当答案与问题无关时......我说的是这个:How to bind the position in a List to an attribute of that element?

我不必对所选项目执行任何操作,只需将列表中的indexOf 绑定(bind)到其属性即可。

我尝试了这个原因,但它没有更新 id 我在列表中移动了元素:

item.indexProperty().bind(Bindings.createIntegerBinding(() -> observableList.indexOf(item), observableList));

如果您在不使用 ListChangeListener 的情况下有任何其他建议,我将不胜感激。

最佳答案

ListChangeListener 是执行此操作的好方法,因为它只需要使用单个监听器。

public static class Item {

private final IntegerProperty index = new SimpleIntegerProperty();

@Override
public String toString() {
return Integer.toString(index.get());
}

}
ObservableList<Item> items = FXCollections.observableArrayList();
items.addListener((ListChangeListener.Change<? extends Item> c) -> {
boolean hadNext;
while ((hadNext = c.next()) && c.wasPermutated()) {
int to = c.getTo();
for (int i = c.getFrom(); i < to; i++) {
items.get(i).index.set(i);
}
}

while (hadNext) {
if (c.wasReplaced()) {
int to = c.getTo();
for (int i = c.getFrom(); i < to; i++) {
items.get(i).index.set(i);
}
} else {
if (!c.wasUpdated()) {
// add/remove change
int to = items.size();
for (int i = c.getFrom(); i < to; i++) {
items.get(i).index.set(i);
}
}
break;
}
hadNext = c.next();
}

});
<小时/>

或者,您可以使用 FXCollections.observableList 并让支持列表处理此问题:

private static class ItemsList extends AbstractList<Item> {

private final List<Item> data = new ArrayList<>();

@Override
public Item get(int index) {
return data.get(index);
}

@Override
public int size() {
return data.size();
}

private void updateFromIndex(int index) {
int size = size();

for (; index < size; index++) {
data.get(index).index.set(index);
}
}

@Override
public Item remove(int index) {
Item result = data.remove(index);
updateFromIndex(index);
return result;
}

@Override
public void add(int index, Item element) {
data.add(index, element);
updateFromIndex(index);
}

@Override
public Item set(int index, Item element) {
element.index.set(index);
return data.set(index, element);
}

}
ObservableList<Item> items = FXCollections.observableList(new ItemsList());

请注意,可以针对支持列表进行多次插入/删除操作的处理优化。

<小时/>

两种情况

for (int i = 0; i < 5; i++) {
System.out.println(items);
items.add(new Item());
}
System.out.println(items);
Collections.swap(items, 0, 4);
System.out.println(items);
Collections.swap(items, 2, 3);
System.out.println(items);
Collections.swap(items, 0, 2);
System.out.println(items);

产生以下控制台打印输出:

[]
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]

关于JavaFx:将列表中元素的索引绑定(bind)到元素的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50854536/

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