Я создал пример проекта, чтобы узнать, как использовать флажки в 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);
}