2014-11-05 2 views
1

Я пытаюсь использовать клеточные фабрики, которые предоставляются JavaFX CheckBoxTreeTableCell, но я не могу понять, как заставить его работать.Как использовать JavaFX CheckBoxTreeTableCell?

Javadoc, похоже, не соответствует реализации. Например:

общественности статической < S, T > обратных вызовов < TreeTableColumn < S, T >, TreeTableCell < S, T > > forTreeTableColumn (Обратный вызов < Целое, ObservableValue < Логическое > > getSelectedProperty)

...

Параметры:

getSelectedProperty - обратный вызов, который, дается объект типа TreeTableColumn < S, T >, будет возвращать ObservableValue <Boolean>, который представляет, выбран ли или нет данный элемент.

Что представляет собой Integer? Есть ли у кого-нибудь примерный код того, как это предназначено для использования?

Спасибо, Роб

ответ

0

Есть четыре метода CheckBoxTreeTableCell.forTreeTableColumn. Все они ожидают обратного вызова, являющегося TreeTableColumn типа ObservableValue<Boolean> или просто TreeTableColumn типа Boolean.

В последнем случае, поскольку вы уже указали столбец, когда метод updateItem вызывается для данного индекса, чтобы отобразить этот флажок, его выбранное состояние находится в этой позиции.

В то время как при методах с обратными вызовами, чтобы найти выбранное состояние для данного индекса, создается call.

Это очень простой вариант использования обеих ситуаций. Вы можете увидеть, как обратный вызов использовать индекс, чтобы войти в коллекцию и получить статус:

private final ObservableList<Person> data = FXCollections.observableArrayList(
     new Person("Staff",false), 
     new Person("John",false), 
     new Person("Greg",true)); 

@Override 
public void start(Stage primaryStage) { 

    TreeItem<Person> rootTree = new TreeItem<>(data(0)); 
    rootTree.setExpanded(true); 
    data.stream().skip(1).forEach(person->rootTree.getChildren().add(new TreeItem<>(person))); 
    TreeTableView<Person> table=new TreeTableView<>(rootTree); 

    TreeTableColumn<Person,String> columnName=new TreeTableColumn<>("Name"); 
    columnName.setCellValueFactory(cellData -> cellData.getValue().getValue().nameProperty()); 
    columnName.setPrefWidth(100); 

    TreeTableColumn<Person,Boolean> columnWeight=new TreeTableColumn<>("Overweight"); 
    // case TreeTableColumn (uncomment to run) 
    // columnWeight.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(columnWeight)); 

    // case Callback: 
    columnWeight.setCellFactory(
      CheckBoxTreeTableCell.forTreeTableColumn(
        (Integer param) -> data.get(param).overWeightProperty())); 

    columnWeight.setCellValueFactory(cellData -> cellData.getValue().getValue().overWeightProperty()); 
    columnWeight.setPrefWidth(150); 
    table.getColumns().addAll(columnName, columnWeight); 
    table.setEditable(true); 

    Scene scene = new Scene(table, 400, 300); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

где:

private class Person { 

    public Person(String name, boolean overWeight) { 
     this.name.set(name); 
     this.overWeight.set(overWeight); 
    } 

    private final StringProperty name = new SimpleStringProperty(); 

    public String getName() { 
     return name.get(); 
    } 

    public void setName(String value) { 
     name.set(value); 
    } 

    public StringProperty nameProperty() { 
     return name; 
    } 
    private final BooleanProperty overWeight = new SimpleBooleanProperty(); 

    public boolean isOverWeight() { 
     return overWeight.get(); 
    } 

    public void setOverWeight(boolean value) { 
     overWeight.set(value); 
    } 

    public BooleanProperty overWeightProperty() { 
     return overWeight; 
    } 
} 
1

Я думаю, что вы хотите использовать forTreeTableColumn (столбец TreeTableColumn).

final TreeTableView<Integer> integerTreeTableView = new TreeTableView<>(); 
    final TreeTableColumn<Integer, Boolean> column = new TreeTableColumn<>(); 
    column.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(column)); 
    column.setCellValueFactory(param -> { 
       if(param.getValue().getValue() > 5) { 
        return new SimpleBooleanProperty(true); 
       } else { 
        return new SimpleBooleanProperty(false); 
       } 
      }); 
    integerTreeTableView.getColumns().add(column); 
Смежные вопросы