Обработка события в CheckListView элементов управления FX

Я пытаюсь работать с Controls FX и Просмотр контрольного списка, но у меня есть несколько вопросов по его использованию:

  • По умолчанию ячейка не выбрана, когда я добавляю элемент в CheckListView, как мне сделать, чтобы он был выбран по умолчанию? Думаю, мне нужно использовать setCheckModel но я потерялся.
  • Как я могу обработать событие, когда кто-то нажимает checkBox? Я не знаю, что делать, потому что событие, которое я обрабатываю, находится на узле, а не на checkBox. Я не понимаю, как использовать eventHandler с этим компонентом.

РЕДАКТИРОВАТЬ: Вот что я делаю:

departureCheckListView.setItems(myListAirport.getObservableDepartureAirtport());
departureCheckListView.getItems().addListener(new ListChangeListener<String>() {
    @Override
    public void onChanged(Change<? extends String> c) {
        c.next();
        if (c.wasAdded()) {
            System.out.println(c.getAddedSubList().get(0));
            //departureCheckListView.getSelectionModel().select(c.getAddedSubList().get(0)); 
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    departureCheckListView.getCheckModel().check(c.getAddedSubList().get(0));
                }
            });
        }
    }
});

Первый элемент, который я добавляю, отмечен флажком, но последующие элементы.

Я не знаю, может ли это помочь, но мой список отсортирован.


person Evans Belloeil    schedule 17.06.2015    source источник


Ответы (1)


В первом случае используйте прослушиватель на the List of Items в CheckListView, чтобы проверить, добавлен ли к нему элемент или нет, затем используйте getSelectionModel().select(<Item>), чтобы выбрать его.

checkListView.getItems().addListener(new ListChangeListener<String>() {
     @Override
     public void onChanged(Change<? extends String> c) {
         c.next();
         if (c.wasAdded()) {
             checkListView.getSelectionModel().select(c.getAddedSubList().get(0));
         }
     }
});

Во втором случае используйте getCheckModel().getCheckedItems(), чтобы получить список элементов, у которых есть checked values. Точно так же проверьте, был ли элемент added / removed из списка.

checkListView.getCheckModel().getCheckedItems().addListener(new ListChangeListener<String>() {
    @Override
    public void onChanged(ListChangeListener.Change<? extends String> c) {
        c.next();
        if(c.wasAdded()) {
             System.out.println("Item Checked : " + c.getAddedSubList().get(0));
        } else if (c.wasRemoved()) {
             System.out.println("Item Unchecked : " + c.getRemoved().get(0));
        }
    }
});

Полный MCVE – Проверено с помощью ControlsFX – 8.40.9

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.controlsfx.control.CheckListView;

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        final ObservableList<String> listOfItems = FXCollections.observableArrayList();
        for (int i = 0; i <= 100; i++) {
            listOfItems.add("Item " + i);
        }
        final CheckListView<String> checkListView = new CheckListView<>(listOfItems);

        // Select the first checkListView element
        checkListView.getItems().addListener(new ListChangeListener<String>() {
            @Override
            public void onChanged(Change<? extends String> c) {
                c.next();
                if (c.wasAdded()) {
                    checkListView.getSelectionModel().select(c.getAddedSubList().get(0));
                }
            }
        });

        // On CheckBox event
        checkListView.getCheckModel().getCheckedItems().addListener(new ListChangeListener<String>() {
            @Override
            public void onChanged(ListChangeListener.Change<? extends String> c) {
                c.next();
                if(c.wasAdded()) {
                    System.out.println("Item Checked : " + c.getAddedSubList().get(0));
                } else if (c.wasRemoved()) {
                    System.out.println("Item Unchecked : " + c.getRemoved().get(0));
                }
            }
        });

    Button button = new Button("Add");
    button.setOnAction(e -> {
        checkListView.getItems().add(0, "Itachi");
            checkListView.requestFocus();
        });
        Scene scene = new Scene(new VBox(checkListView, button), 300, 275);
        primaryStage.setTitle("Welcome");
        primaryStage.setScene(scene);
        primaryStage.show();

    }
}

Обновить : для проверки флажка нового добавленного элемента вместо выбора

Использовать :

checkListView.getCheckModel().check(c.getAddedSubList().get(0));

вместо

checkListView.getSelectionModel().select(c.getAddedSubList().get(0));

Если вы хотите, чтобы он был проверен и в то же время выбран, вы можете использовать both of them.

person ItachiUchiha    schedule 17.06.2015
comment
Вау, я никогда не думал об этом для второго случая, я работал над чем-то с setOnClick, это действительно помогает мне, спасибо. - person Evans Belloeil; 17.06.2015
comment
Вы уверены, что ваш код работает? Поскольку решение для первого случая у меня не работает, когда я добавляю элемент в свой CheckListView, флажок все еще пуст... - person Evans Belloeil; 17.06.2015
comment
@EvansBelloeil В первом случае ячейка выбирается, как вы упомянули в своем вопросе. Если вы хотите, чтобы он был проверен, см. обновление. - person ItachiUchiha; 17.06.2015
comment
Это не работает:/даже если c.getAddedSubList().get(0) вернет мне правильный вставленный элемент - person Evans Belloeil; 17.06.2015
comment
Это отлично работает для меня, можете ли вы показать мне, что вы пробовали и что именно не работает? Может быть, я не правильно понял ваше требование. Вы хотите, чтобы вновь добавленный элемент был проверен, верно? - person ItachiUchiha; 17.06.2015
comment
Я исправил это с помощью platform.runLater, но работает только для первого элемента, см. Мое обновление для получения дополнительной информации. - person Evans Belloeil; 17.06.2015
comment
Если вы выполняете это действие в каком-то потоке, отличном от потока приложения JavaFX, вам нужно Platform.runLater, в противном случае в этом нет необходимости. Тем не менее, я бы посоветовал вам запустить MCVE, который я предоставил, и проверить, работает ли он в соответствии с вашими требованиями, если нет, четко изложите свое требование. - person ItachiUchiha; 17.06.2015
comment
Ваш обновленный пост не добавляет никаких подробностей о том, как добавляются данные. Можете ли вы попытаться воспроизвести свою проблему в MCVE? - person ItachiUchiha; 17.06.2015
comment
c.getAddedSubList().get(0) всегда возвращает мне один и тот же элемент, поэтому он не работает... Я добавляю элементы просто с помощью add и сортирую список каждый раз, когда добавляется элемент. - person Evans Belloeil; 17.06.2015
comment
Я протестировал его с отсортированной коллекцией, и это может быть ошибка (хотя я все еще не уверен). Я обнаружил еще несколько проблем и зарегистрировал их все в тикете. с разработчиками ControlsFX. Вы можете следить за обновлениями. :) - person ItachiUchiha; 19.06.2015
comment
@EvansBelloeil У меня была та же проблема с первым случаем, и runLater тоже решил проблему. Что странно, потому что я на главной ветке! - person Pixel; 01.08.2018