JavaFx,实现CheckBox复选框的全选和全不选。子复选框单个全部选择后,全选框也会被选择;子复选框单个全部不选后,全选框也会被不选。
fxml文件中:
<CheckBox fx:id="selectAll" onAction="#selectBox" layoutY="77.0" visible="true" mnemonicParsing="false" prefHeight="23.0" prefWidth="92.0" text="全选" />
<TableView fx:id="table" stylesheets="/css/userInfoTab.css" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="100.0">
<columns>
<TableColumn fx:id="select" visible="true" prefWidth="60.0" text="选择"> </TableColumn>
<TableColumn prefWidth="110.0" text="姓名">
<cellValueFactory>
<PropertyValueFactory property="name" />
</cellValueFactory>
</TableColumn>
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TableView>
Controller文件中:
@FXML private TableView<CxCadreInfo> table;
@FXML private CheckBox selectAll;
@FXML private TableColumn<CxCadreInfo, CheckBox> select;
/**
* 全选框触发事件,勾选则所有checkbox复选框都勾选,不勾选则所有checkbox复选框不勾选
*/
public void selectBox(){
ObservableList<CxCadreInfo> items = table.getItems();
if (selectAll.isSelected()){
for (CxCadreInfo cxCadreInfo:items){
cxCadreInfo.cb.setSelect(true);
}
}else {
for (CxCadreInfo cxCadreInfo:items){
cxCadreInfo.cb.setSelect(false);
}
}
}
//在init初始化方法中写复选框监听事件
//初始化所有checkbox复选框
select.setCellValueFactory(cellData ->cellData.getValue().cb.getCheckBox());
//初始化复选框-监听-所有checkbox复选框都勾选则全选框勾选,所有checkbox复选框不勾选则全选框不勾选
Callback<TableColumn<CxCadreInfo, CheckBox>, TableCell<CxCadreInfo, CheckBox>> cellFactory1 =
new Callback<TableColumn<CxCadreInfo, CheckBox>, TableCell<CxCadreInfo, CheckBox>>() {
public TableCell call(TableColumn p) {
TableCell cell = new TableCell<CxCadreInfo, CheckBox>() {
@Override
public void updateItem(CheckBox item, boolean empty) {
super.updateItem(item, empty);
setGraphic(item);
if (item!= null) {
item.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
boolean booSelectAll = true;
ObservableList<CxCadreInfo> items2 = table.getItems();
for (CxCadreInfo cxCadreInfo2:items2){
if (!cxCadreInfo2.cb.isSelected()) {
booSelectAll = false;
break;
}
}
selectAll.setSelected(booSelectAll);
}
});
}
}
};
return cell;
}
};
select.setCellFactory(cellFactory1);
效果: