我已经创建了一个示例项目来学习如何在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);
}
答案 0 :(得分:0)
为每个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());
}
}
});
}