Tableview 使特定单元格或行可编辑
Tableview make specific cell or row editable
有什么方法可以在 JavaFX 中仅使特定的单元格或行可编辑TableView
?
row 0 = editable(false)
row 1 = editable(true)
我想将最终数据放在第 0 行,将用户数据(来自编辑单元格)放在第 1 行
这可能吗?
以根据索引设置 editable
属性 的方式覆盖您与 TableView
一起使用的可编辑单元格的 updateIndex
方法:
public class StateTextFieldTableCell<S, T> extends TextFieldTableCell<S, T> {
private final IntFunction<ObservableValue<Boolean>> editableExtractor;
public StateTextFieldTableCell(IntFunction<ObservableValue<Boolean>> editableExtractor, StringConverter<T> converter) {
super(converter);
this.editableExtractor = editableExtractor;
}
@Override
public void updateIndex(int i) {
super.updateIndex(i);
if (i == -1) {
editableProperty().unbind();
} else {
editableProperty().bind(editableExtractor.apply(i));
}
}
public static <U, V> Callback<TableColumn<U, V>, TableCell<U, V>> forTableColumn(
IntFunction<ObservableValue<Boolean>> editableExtractor,
StringConverter<V> converter) {
return column -> new StateTextFieldTableCell<>(editableExtractor, converter);
}
public static <U> Callback<TableColumn<U, String>, TableCell<U, String>> forTableColumn(
IntFunction<ObservableValue<Boolean>> editableExtractor) {
return forTableColumn(editableExtractor, new DefaultStringConverter());
}
}
使用示例:
以下示例允许编辑单元格,即第二项,但只能编辑一次。
@Override
public void start(Stage primaryStage) {
TableView<Item<String>> tableView = new TableView<>(FXCollections.observableArrayList(
new Item<>("0"),
new Item<>("1")));
tableView.setEditable(true);
ObservableMap<Integer, Boolean> editable = FXCollections.observableHashMap();
editable.put(1, Boolean.TRUE);
TableColumn<Item<String>, String> column = new TableColumn<>();
column.setOnEditCommit(evt -> {
editable.remove(evt.getTablePosition().getRow());
});
column.setCellValueFactory(new PropertyValueFactory<>("value"));
column.setCellFactory(StateTextFieldTableCell.forTableColumn(i -> Bindings.valueAt(editable, i).isEqualTo(Boolean.TRUE)));
tableView.getColumns().add(column);
Scene scene = new Scene(tableView);
primaryStage.setScene(scene);
primaryStage.show();
}
有什么方法可以在 JavaFX 中仅使特定的单元格或行可编辑TableView
?
row 0 = editable(false)
row 1 = editable(true)
我想将最终数据放在第 0 行,将用户数据(来自编辑单元格)放在第 1 行
这可能吗?
以根据索引设置 editable
属性 的方式覆盖您与 TableView
一起使用的可编辑单元格的 updateIndex
方法:
public class StateTextFieldTableCell<S, T> extends TextFieldTableCell<S, T> {
private final IntFunction<ObservableValue<Boolean>> editableExtractor;
public StateTextFieldTableCell(IntFunction<ObservableValue<Boolean>> editableExtractor, StringConverter<T> converter) {
super(converter);
this.editableExtractor = editableExtractor;
}
@Override
public void updateIndex(int i) {
super.updateIndex(i);
if (i == -1) {
editableProperty().unbind();
} else {
editableProperty().bind(editableExtractor.apply(i));
}
}
public static <U, V> Callback<TableColumn<U, V>, TableCell<U, V>> forTableColumn(
IntFunction<ObservableValue<Boolean>> editableExtractor,
StringConverter<V> converter) {
return column -> new StateTextFieldTableCell<>(editableExtractor, converter);
}
public static <U> Callback<TableColumn<U, String>, TableCell<U, String>> forTableColumn(
IntFunction<ObservableValue<Boolean>> editableExtractor) {
return forTableColumn(editableExtractor, new DefaultStringConverter());
}
}
使用示例:
以下示例允许编辑单元格,即第二项,但只能编辑一次。
@Override
public void start(Stage primaryStage) {
TableView<Item<String>> tableView = new TableView<>(FXCollections.observableArrayList(
new Item<>("0"),
new Item<>("1")));
tableView.setEditable(true);
ObservableMap<Integer, Boolean> editable = FXCollections.observableHashMap();
editable.put(1, Boolean.TRUE);
TableColumn<Item<String>, String> column = new TableColumn<>();
column.setOnEditCommit(evt -> {
editable.remove(evt.getTablePosition().getRow());
});
column.setCellValueFactory(new PropertyValueFactory<>("value"));
column.setCellFactory(StateTextFieldTableCell.forTableColumn(i -> Bindings.valueAt(editable, i).isEqualTo(Boolean.TRUE)));
tableView.getColumns().add(column);
Scene scene = new Scene(tableView);
primaryStage.setScene(scene);
primaryStage.show();
}