2016-09-19 13 views

答えて

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()); 
    } 

} 

を:

次の例では、編集することができますセル、2番目の項目ですが、1回のみです。

@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(); 
} 
関連する問題