Получить текст для выбранного CheckBox в JavaFx ListView

Я создал пример проекта, чтобы узнать, как использовать флажки в ListView.

Когда я выбираю флажок, я хочу распечатать его значение (т.е. текстовое значение на метке флажка).

Что происходит сейчас, когда я выбираю флажок, например. Ряд 5, распечатывается:
Ряд 5

И когда я продолжаю устанавливать флажок для строки 7, распечатывается следующее:
строка 5
строка 7

Таким образом, все распечатки выглядят следующим образом:
Row5
Row5 ‹-- не следует здесь распечатывать!
Row7

Как видите, проблема в том, что когда я устанавливаю один флажок, распечатываются ВСЕ выбранные флажки.

То же самое, если я сниму отметку с строки 7, я хочу распечатать, что ТОЛЬКО строка 7 не отмечена. Но теперь все неотмеченные флажки распечатываются.

package listviewtest;

    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.CheckBox;
    import javafx.scene.control.Label;
    import javafx.scene.control.ListCell;
    import javafx.scene.control.ListView;
    import javafx.scene.control.cell.CheckBoxListCell;
    import javafx.util.Callback;
    import javafx.util.StringConverter;

    public class SubGuiController implements Initializable {
        @FXML private ListView listView;
        @FXML private Button btnUnselectAll;
        @FXML private Button btnSelectAll;
        @FXML private Label lblSelected;

        /**
         * Initializes the controller class.
         */
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            final ObservableList<CheckBoxHandler> data = FXCollections.observableArrayList();

            for(int i=0; i<10; i++) {
                data.add(new CheckBoxHandler(false, "Row " + i));
            }

                ChangeListener<Boolean> listener = new ChangeListener<Boolean>() {

                    @Override
                    public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldValue, Boolean selected) {

                        // In this loop, we get all selected/unselected checkboxes...
                        for (CheckBoxHandler cbh : data) {

                            if (selected) {
                                if (cbh.getSelected()) {
                                    System.out.println("selected: " + cbh.getCheckBoxText() + ": " + cbh.getSelected());
                                }
                            }
                            else if (!selected) {
                                if (!cbh.getSelected()) {
                                    System.out.println("unselected: " + cbh.getCheckBoxText());
                                }
                            }
                        }
                    }
                };

                for(CheckBoxHandler cbh: data) {
                    cbh.selectedProperty().addListener(listener);
                }

            listView.setItems(data);
    }

person Ramon    schedule 10.06.2014    source источник


Ответы (1)


Добавьте разных слушателей к каждому CheckBoxHandler:

for (final CheckBoxHandler cbh : data) {
    cbh.selectedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> obs, Boolean wasSelected, Boolean isSelected) {
            if (isSelected) {
                System.out.println("selected: "+cbh.getCheckBoxText());
            } else {
                System.out.println("unselected: "+cbh.getCheckBoxText());
            }
        }
    });
}
person James_D    schedule 10.06.2014