2016-09-19 63 views

回答

1

重寫你的方式與你的TableView使用可編輯單元格的updateIndex方法,根據索引設置editable屬性:

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(); 
} 
相關問題