如何在Table-Column中启用Check-Box enable禁用在JavaFX中,如果我选择一个复选框,我需要禁用剩余的复选框。
如果我选中一个复选框,我需要在JavaFx中禁用表视图中的剩余复选框。
colSelect.setCellFactory(new Callback<TableColumn<LogVoiceBroadCast, Boolean>, TableCell<LogVoiceBroadCast, Boolean>>()
{
@Override
public TableCell<LogVoiceBroadCast, Boolean> call(TableColumn<LogVoiceBroadCast, Boolean> param) {
final TableCell<LogVoiceBroadCast, Boolean> cell = new TableCell<LogVoiceBroadCast, Boolean>() {
@Override
public void updateItem(Boolean value, boolean empty) {
super.updateItem(value, empty);
if (!empty || value != null) {
CheckBox checkBox = new CheckBox();
checkBox.setSelected(false);
checkBox.addEventHandler(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
if (!checkBox.isSelected()) {
LogVoiceBroadCast item = (LogVoiceBroadCast) getTableRow().getItem();
voiceFiles.add(item);
} else {
LogVoiceBroadCast item = (LogVoiceBroadCast) getTableRow().getItem();
voiceFiles.remove(item);
}
}
});
final HBox hbox = new HBox(checkBox);
hbox.setAlignment(Pos.CENTER);
hbox.setSpacing(12);
setGraphic(hbox);
} else {
setGraphic(null);
}
}
};
cell.setAlignment(Pos.CENTER);
return cell;
}
});
您不应该使用for输入事件来触发监听CheckBox
状态的更改。而是添加一个监听器到CheckBox.selected
属性。
此外,您需要实现一种恢复CheckBox
状态的方法,因为不同的TableCell
s可用于“检查行”。使用一些可观察的数据结构来存储这种信息并使用监听器来更新CheckBox
es的状态:
TableView<Integer> table = new TableView<>();
for (int i = 0; i < 100; i++) {
table.getItems().add(i);
}
TableColumn<Integer, Number> column = new TableColumn<>();
column.setCellValueFactory(cd -> new SimpleIntegerProperty(cd.getValue()));
// property to store the checked row item or null, if no row is checked
final ObjectProperty<Integer> selectedValue = new SimpleObjectProperty<>();
TableColumn<Integer, Void> checkBoxColumn = new TableColumn<>();
checkBoxColumn.setCellFactory(col -> new TableCell<Integer, Void>() {
private final CheckBox checkBox = new CheckBox();
private final ChangeListener<Boolean> selectionListener = (o, oldValue, newValue) -> {
if (newValue) {
// use the row item as selected item, when checkbox is selected
selectedValue.set((Integer) getTableRow().getItem());
} else {
// clear selected item, when checkbox is unselected
selectedValue.set(null);
}
};
private final ChangeListener<Integer> listener = (o, oldValue, newValue) -> {
if (!isEmpty()) {
// update state without triggering the listener
checkBox.selectedProperty().removeListener(selectionListener);
if (newValue == null) {
checkBox.setSelected(false);
checkBox.setDisable(false);
} else {
boolean match = newValue.equals(getTableView().getItems().get(getIndex()));
checkBox.setSelected(match);
checkBox.setDisable(!match);
}
checkBox.selectedProperty().addListener(selectionListener);
}
};
{
// listener should not prevent garbage collection of cell
selectedValue.addListener(new WeakChangeListener<>(listener));
checkBox.selectedProperty().addListener(selectionListener);
setAlignment(Pos.CENTER);
}
@Override
protected void updateItem(Void item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setGraphic(null);
} else {
setGraphic(checkBox);
listener.changed(null, null, selectedValue.get());
}
}
});
table.getColumns().addAll(column, checkBoxColumn);