Полагаю, вы можете немного упростить свой контроллер.Попробуйте изменить код вашего контроллера на:
public class Controller {
@FXML
private TableView<Model> tableBuilding;
@FXML
private TableColumn<Model, Boolean> colActive;
@FXML
private TableColumn<Model, Model> colAction;
@FXML
public void initialize() {
// Sample List
ObservableList<Model> models = FXCollections.observableArrayList();
models.addAll(
new Model(),
new Model(),
new Model()
);
tableBuilding.setItems(models);
//Containing the button
colAction.setCellFactory(col -> {
Button ShowButton = new Button("Show");
TableCell<Model, Model> cell = new TableCell<>() {
@Override
//Updating with the number of row
public void updateItem(Model building, boolean empty) {
super.updateItem(building, empty);
if (empty) {
setGraphic(null);
} else {
setGraphic(ShowButton);
}
}
};
ShowButton.setOnAction(event -> {
TableRow row = cell.getTableRow();
Model building = (Model) row.getItem();
System.out.println(building.getActive());
});
return cell;
});
//Containing the checkbox
colActive.setCellValueFactory(new PropertyValueFactory<>("active"));
colActive.setCellFactory(col -> new CheckBoxTableCell<>());
}
}
В частности, последние две строки кода;вам не нужно указывать свой собственный TableCell
, поскольку CheckBoxTableCell
самостоятельно обрабатывает обновление Model
.
Однако класс Model
необходимо изменить, чтобы обновить Active
поле для истинного свойства;в противном случае TableView
не сможет обновить его должным образом.Строка в вашем контроллере colActive.setCellValueFactory(new PropertyValueFactory<Model,Boolean>("Active"));
указывает, что значение ячейки должно быть привязано к свойству JavaFX в вашем Model
классе с именем Active
, но такого свойства нет.
Вот правильный способ определения свойства:
public class Model {
private SimpleBooleanProperty active = new SimpleBooleanProperty(true);
public boolean getActive() {
return active.get();
}
public SimpleBooleanProperty activeProperty() {
return active;
}
public void setActive(boolean active) {
this.active.set(active);
}
}
Интересно, что это один из тех случаев, когда важно следовать надлежащим практикам Java-кодирования.Свойство Active
здесь также должно быть в нижнем регистре, без заглавных букв.