Javafx как переопределить слушателя LIstView

У меня есть приложение 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, а затем становлюсь нерешительным и хочу, чтобы кнопка приняла решение за меня. Я нажимаю кнопку, и она случайным образом выбирает «банан». Приложение выглядит так:

Javafx как переопределить слушателя LIstView

Поле textA отображает случайно выбранную строку кнопки ... но ListView по-прежнему показывает "оранжевый" выбранный. Конечно, это то, что должен делать код ... но мне нужно решение, в котором выбор ListView соответствует тому, что выбрано кнопкой. Правильный вид должен быть таким:

Javafx как переопределить слушателя LIstView

Это тонкая вещь, но важная по причинам, выходящим за рамки этой публикации. Но ДОЛЖЕН быть способ закодировать кнопку, чтобы по существу использовать (переопределить?) ListView так же, как это делает пользователь, т.е. когда вы нажимаете кнопку, случайно выбранный элемент выделяется в ListView. Как мне для этого перекодировать кнопку?

Большое спасибо

У меня недостаточно времени, чтобы написать правильный ответ, я позволю кому-нибудь другому это сделать. В основном его myListView.getSelectionModel().select(randomlyPicked); В ваших кнопках setOnAction

Hypnic Jerk 20.03.2018 15:53

@HypnicJerk Да! Да, это прекрасно работает. Я видел эту команду раньше, но никогда не понимал, как ее применять. Спасибо!

Pete 20.03.2018 21:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете 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 20.03.2018 16:01

@James_D Да, решение фабиана делает эту строку лишней. Это именно то, на что я надеялся. :)

Pete 20.03.2018 21:39

Другие вопросы по теме