Javafx如何覆盖LIstView的监听器

时间:2018-03-20 14:47:56

标签: listview javafx override listener

我有一个带有ListView的JavaFX应用程序:

    ...
    ArrayList<String> arrList = new ArrayList<>();
    String[] fruitArr = {"apple", "orange", "banana", "peach", "grapes", "watermelon", "kiwi"};
    arrList.addAll(Arrays.asList(fruitArr));
    ObservableList<String> obList = FXCollections.observableArrayList(arrList);

    myListView.setItems(obList);
    myListView
        .getSelectionModel()
        .selectedIndexProperty()
        .addListener(
            (obs, oldVal, newVal) -> displaySelection(newVal));
    ...

...later...
private void displaySelection(Number newVal) {
    textA.setText("Your Selection Is: "+arrList.get((int) newVal));
}

我还有一个代表用户随机选择项目的按钮:

    btnPickSomething.setOnAction(event -> {
        Random rand = new Random();
        String randomlyPicked = arrList.get(rand.nextInt(arrList.size()));
        textA.setText("Your Selection Is: "+randomlyPicked);
    });

这是相当简单的JavaFX 101类型的东西。这是我无法弄清楚的:假设我在ListView中单击“orange”然后变得优柔寡断,并希望按钮为我做出决定。我点击按钮,随机选择“香蕉”。该应用程序如下所示:

My Fruit App - Button selects one thing, ListView not sync'ed

textA字段显示按钮的随机选择字符串...但ListView仍然显示选中“橙色”。当然,这就是代码应该做的...但我想要一个解决方案,其中ListView选项与按钮选择的匹配。正确的观点应该是这样的:

My Fruit App - Button and ListView are sync'ed

这是一个微妙的事情,但对于超出本文范围的原因很重要。但必须有一种方法来编码按钮,以与用户相同的方式使用(覆盖?)ListView,即,当您单击按钮时,随机选择的项目在ListView中突出显示。如何重新编码按钮才能执行此操作?

非常感谢

1 个答案:

答案 0 :(得分:3)

您使用selectionModel ListView来操纵选择。这可以通过传递项目或它的索引来完成:

Random rand = new Random();
int index = rand.nextInt(arrList.size());

myListView.getSelectionModel().select(index);

您也可以用

替换最后一行
String item = myListView.getItems().get(index);
myListView.getSelectionModel().select(item);

但在这种情况下,您始终选择重复的ListView项中的第一项。