JavaFX随机填充列表视图

JavaFX随机填充列表视图,javafx,Javafx,我试着做一个程序,你可以在其中添加名字作为复选框。通过检查它们并按下随机按钮,所有名称将被放置在2个不同的ListView中(每个名称只能放置一次,每个ListView中必须有相同数量的名称或1个以上的名称)。我不知道该如何写在“onRandom”部分 下面这一个只是为了测试 .forEach(value -> { listview1.getItems().add(value.getText()); listv

我试着做一个程序,你可以在其中添加名字作为复选框。通过检查它们并按下随机按钮,所有名称将被放置在2个不同的ListView中(每个名称只能放置一次,每个ListView中必须有相同数量的名称或1个以上的名称)。我不知道该如何写在“onRandom”部分

下面这一个只是为了测试

.forEach(value -> {
                    listview1.getItems().add(value.getText());
                    listview2.getItems().add(value.getText());
                });
这是我的FXML文件,用于创建列表的随机排列,然后将前半部分添加到一个
ListView
,将其余部分添加到另一个

// do not use raw types
@FXML
private ListView<String> listview1;
@FXML
private ListView<String> listview2;
...

private final Random randomNumberGenerator = new Random();
对于
父项的
子项
列表,不需要检查
null
。列表实现防止将
null
插入该列表。前一个过滤器在谓词产生
false
的情况下抛出了NPE。如果确实需要这样的谓词,可以使用方法引用来缩短代码:

.filter(Objects::nonNull)

你说每个名字只能放一次是什么意思?你的意思是列表视图不应该包含重复的名称?还是里面还有一个名字?你能举个例子来说明你的要求吗?是的,ListView不能保存重复项。下面是一个示例:好的,是否存在将文本值放入列表视图的条件。我的意思是,在你的例子中,我可以看到listview1和listview2有2/2个不同的文本-你的意思是你试图随机放置吗?应该是这样的:将名称(选中)随机放置到两个不同的ListView中。它应该像每次按下按钮一样工作,每个ListView存储不同的名称。请这里不是任何外部站点
List<String> items = new ArrayList<>(); // copy children to new list

// the following loop imho is easier to comprehend than the Stream implementation
for (Node child : vbox.getChildren()) {
    CheckBox cb = (CheckBox) child;
    if (cb.isSelected) {
        items.add(cb.getText());
    }
}

Collections.shuffle(items, randomNumberGenerator);
final int size = items.size();
final int half = size / 2;

// add first half to first ListView and second half to second ListView
listview1.getItems().setAll(items.sublist(0, half));
listview2.getItems().setAll(items.sublist(half, size));
.filter(value -> Objects.nonNull(value))
.filter(Objects::nonNull)