У меня есть приложение JavaFX с ListView:
...
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, а затем становлюсь нерешительным и хочу, чтобы кнопка приняла решение за меня. Я нажимаю кнопку, и она случайным образом выбирает «банан». Приложение выглядит так:
Поле textA отображает случайно выбранную строку кнопки ... но ListView по-прежнему показывает "оранжевый" выбранный. Конечно, это то, что должен делать код ... но мне нужно решение, в котором выбор ListView соответствует тому, что выбрано кнопкой. Правильный вид должен быть таким:
Это тонкая вещь, но важная по причинам, выходящим за рамки этой публикации. Но ДОЛЖЕН быть способ закодировать кнопку, чтобы по существу использовать (переопределить?) ListView так же, как это делает пользователь, т.е. когда вы нажимаете кнопку, случайно выбранный элемент выделяется в ListView. Как мне для этого перекодировать кнопку?
Большое спасибо
@HypnicJerk Да! Да, это прекрасно работает. Я видел эту команду раньше, но никогда не понимал, как ее применять. Спасибо!





Вы используете 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.
Вы также можете удалить строку textA.setText(...), потому что слушатель в модели выбора представления списка все равно будет запускаться.
@James_D Да, решение фабиана делает эту строку лишней. Это именно то, на что я надеялся. :)
У меня недостаточно времени, чтобы написать правильный ответ, я позволю кому-нибудь другому это сделать. В основном его
myListView.getSelectionModel().select(randomlyPicked);В ваших кнопкахsetOnAction