JavaFX如何获取TableView中CheckBox勾选为true的对应行数据
问题原因&解决方案
你遇到的勾选后remark值一直为false的问题,核心是两个配置错误:
- TableView未开启全局编辑权限,仅给列设置editable=true无法触发值回写
- OMission类的remark字段是普通Boolean类型,不支持JavaFX的双向绑定,CheckBox的选中状态无法同步到模型对象
- 额外语法错误:OMission构造方法中大写的
This是非法写法,Java大小写敏感需要改为小写this,同时成员变量赋值逻辑也有大小写写错的问题。
第一步:修改OMission模型类,改为支持可观测属性
import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; public class OMission { private final StringProperty objMission; private final BooleanProperty remark; public OMission(String objMission) { this.objMission = new SimpleStringProperty(objMission); this.remark = new SimpleBooleanProperty(false); } // remark的相关绑定方法 public boolean isRemark() { return remark.get(); } public BooleanProperty remarkProperty() { return remark; } public void setRemark(boolean remark) { this.remark.set(remark); } // objMission的相关绑定方法 public String getObjMission() { return objMission.get(); } public StringProperty objMissionProperty() { return objMission; } public void setObjMission(String objMission) { this.objMission.set(objMission); } }
第二步:修改控制器配置
基础实现(1000条以内数据无性能压力,直接遍历过滤)
修改load_recap方法:
public void load_recap(){ // 省略其他加载数据的逻辑 missionTable.setEditable(true); // 必须开启TableView全局编辑权限 checkedCol.setCellFactory(CheckBoxTableCell.forTableColumn(checkedCol)); // 直接绑定可观测属性,不要用PropertyValueFactory checkedCol.setCellValueFactory(cellData -> cellData.getValue().remarkProperty()); checkedCol.setEditable(true); missionTable.setItems(UserMission); // 别忘了把数据源绑定到TableView }
print_tab方法直接过滤即可:
public void print_tab() throws Exception { // 流式过滤获取所有勾选的行,写法简洁性能足够 List<OMission> selectedMissions = UserMission.stream() .filter(OMission::isRemark) .toList(); // 后续直接处理selectedMissions即可 }
优化实现(适合超大数据量,无需遍历全量集合)
给控制器新增一个专门存选中项的集合:
private final ObservableList<OMission> selectedMissions = FXCollections.observableArrayList();
在给UserMission添加数据的位置,给每个新增的OMission绑定选中监听:
// 你添加OMission到UserMission的逻辑位置 OMission mission = new OMission("你的任务数据"); mission.remarkProperty().addListener((obs, oldVal, newVal) -> { if (newVal) { selectedMissions.add(mission); } else { selectedMissions.remove(mission); } }); UserMission.add(mission);
之后print_tab方法可以直接拿到所有选中项,无需遍历:
public void print_tab() throws Exception { // 直接拿到已选中的所有行 System.out.println(selectedMissions.size()); // 后续处理逻辑 }
额外功能:全选复选框实现
你FXML里的SelectAll复选框可以直接绑定全局选中逻辑:
// 在initialize或者load_recap方法中添加 SelectAll.selectedProperty().addListener((obs, oldVal, newVal) -> { UserMission.forEach(mission -> mission.setRemark(newVal)); });
内容的提问来源于stack exchange,提问作者dEs12ZER
相关产品推荐
相关产品推荐

