gpt4 book ai didi

java - MultipleSelectionModel:哪个列表更改事件可以从 selectedIndices 中获得?

转载 作者:行者123 更新时间:2023-11-30 11:12:23 24 4
gpt4 key购买 nike

...特别是在修改基础项目时?

下面是一个快速示例,它选择一个范围并在 TableView 和 ListView 的选择上方添加一个项目。添加前后的selectedIndices:

indices before modification: [2, 3]
indices after modification: [3, 4]

预期选项:

  • 在整个范围内更换了一个
  • 为“2”删除了一个,为“4”添加了一个
  • ??

实际:

  • 表的选择会触发两个事件,每个事件都有一个 wasAdded
  • list 的选择触发了一个 wasPermutated(这太疯狂了,或者我错过了什么?)

输出(jdk8u40b12):

Change #0 on TableView indices 
list = [3]
Change event data:

class javafx.scene.control.MultipleSelectionModelBase$3
javafx.scene.control.MultipleSelectionModelBase$3@4ececa
cursor = 0
Kind of change: added
Affected range: [0, 1]
Added size: 1
Added sublist: [3]

Change #1 on TableView indices
list = [3, 4]
Change event data:

class javafx.scene.control.MultipleSelectionModelBase$3
javafx.scene.control.MultipleSelectionModelBase$3@b0161d
cursor = 0
Kind of change: added
Affected range: [1, 2]
Added size: 1
Added sublist: [4]

Change #0 on ListView indices
list = [3, 4]
Change event data:

class com.sun.javafx.collections.NonIterableChange$SimplePermutationChange
{ permutated by [4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0] }
cursor = 0
Kind of change: permutated
Affected range: [0, 2]
Permutation: [0->4, 1->3]

生成代码:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.collections.ListChangeListener.Change;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

public class SelectedIndicesOnItemsModified extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
ObservableList<Integer> items = FXCollections.observableArrayList(1, 2, 3, 4);
TableView<Integer> table = new TableView<>(items);
table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
table.getSelectionModel().selectRange(2, 4);
System.out.println("indices before modification: " +
table.getSelectionModel().getSelectedIndices());
ListView<Integer> list = new ListView<>(items);
list.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
list.getSelectionModel().selectRange(2, 4);

new PrintingListChangeListener("TableView indices ",
table.getSelectionModel().getSelectedIndices());
new PrintingListChangeListener("ListView indices ",
list.getSelectionModel().getSelectedIndices());
items.add(0, 111);
}

public static void main(String[] args) {
launch(args);
}

public static <T> void prettyPrint(Change<? extends T> change) {
StringBuilder sb = new StringBuilder("\tChange event data:\n");
sb.append("\n " + change.getClass() + "\n " + change);
int i = 0;
change.reset();
while (change.next()) {
sb.append("\n\tcursor = ").append(i++).append("\n");

final String kind = change.wasPermutated() ? "permutated" : change
.wasReplaced() ? "replaced"
: change.wasRemoved() ? "removed"
: change.wasAdded() ? "added"
: change.wasUpdated() ? "updated" : "none";
sb.append("\t\tKind of change: ").append(kind).append("\n");

sb.append("\t\tAffected range: [").append(change.getFrom())
.append(", ").append(change.getTo()).append("]\n");

if (kind.equals("added") || kind.equals("replaced")) {
sb.append("\t\tAdded size: ").append(change.getAddedSize())
.append("\n");
sb.append("\t\tAdded sublist: ")
.append(change.getAddedSubList()).append("\n");
}

if (kind.equals("removed") || kind.equals("replaced")) {
sb.append("\t\tRemoved size: ").append(change.getRemovedSize())
.append("\n");
sb.append("\t\tRemoved: ").append(change.getRemoved())
.append("\n");
}

if (kind.equals("permutated")) {
StringBuilder permutationStringBuilder = new StringBuilder("[");
for (int k = change.getFrom(); k < change.getTo(); k++) {
permutationStringBuilder.append(k).append("->")
.append(change.getPermutation(k));
if (k < change.getTo() - 1) {
permutationStringBuilder.append(", ");
}
}
permutationStringBuilder.append("]");
String permutation = permutationStringBuilder.toString();
sb.append("\t\tPermutation: ").append(permutation).append("\n");
}
}
System.out.println(sb.toString());
};

public static class PrintingListChangeListener implements ListChangeListener {
String source;
int counter;
public PrintingListChangeListener() {
}

public PrintingListChangeListener(String message, ObservableList<?> list) {
list.addListener(this);
source = message;
}
@Override
public void onChanged(Change change) {
System.out.println("Change #" + counter++ + " on " +source +
"\nlist = " + change.getList());
prettyPrint(change);
}
}

}

提交了两个问题,RT-39393对于 ListView ,RT-39394对于 TableView

最佳答案

对我自己的问题的初步部分回答

通知计数

在伪代码中,通知的数量(又名:调用 changed(Change c))应该与基础数据中的数量相同

itemsChanges = 0; 
itemsListener = c -> itemsChanges++;
getItems().addListener(itemsListener);
selectedChanges = 0;
selectedListener = c -> selectedChanges++;
getSelectedIndices().addListener(selectedListener);
getItems().modifySomehow(...);
assertEquals(itemsChanges, selectedChanges);

变化类型

仔细想想,底层项目的大部分变化似乎都映射到 selectedIndices 中的替换项(下面的“值”表示 selectedIndices 中的元素):

"real"wasAdded:所有大于插入位置的值都必须增加 addedSize

// selectedIndices before
[2, 4]
items.add(0, something);
// selectedIndices after
[3, 5]

-> 净效果:两个值被设置(==替换为)一个新值

"real"wasRemoved:所有指向已删除项目的值也必须被删除,大于删除位置的值必须减少 removedSize

// selectedIndices before
[2, 4, 5, 8]
items.removeAll(items.get(3), items.get(5))
// selectedIndices after
[2, 3, 6]

-> 净效果:将位置 1 的 [4, 5, 8] 替换为 [3, 6]

wasUpdated:索引未更改,但基础项目确实以某种方式发生了变化。根据上下文,将这些更新传递给或不传递给它的监听器可能是个好主意。

仍然开放:项目中的替换/排列

要获得那些预期的(至少通过我的论文编码 :-) 正确的通知,不是很简单 - 并且在 MultipleSelectionModelBase 和子类中出错。目前正在尝试将所有令人讨厌的细节移到专用的 IndicesList 中(这是一个以项目作为源列表的 TransformList)

关于java - MultipleSelectionModel:哪个列表更改事件可以从 selectedIndices 中获得?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26913280/

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