2016-06-04 2 views
0

파일의 데이터를 기반으로 차트를 생성하는 간단한 응용 프로그램을 만들고 싶습니다. 그런 다음 동적으로 열을 추가하고 바인딩하려고합니다.Tableview에 동적으로 바인딩 추가

모델 클래스 :

public class ChartData { 
private ObservableList<String> series; 
private ObservableList<Data> data; 

public ChartData(){ 
    series = FXCollections.observableArrayList(); 
    data = FXCollections.observableArrayList(); 
} 

//getters, setters ommited 
} 

public class Data { 

private final StringProperty name = new SimpleStringProperty(this, "name"); 
private final ObservableList<Property<Number>> values = FXCollections.observableArrayList(); 


public ObservableList<Property<Number>> getValues() { 
    return values; 
} 

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

public final StringProperty nameProperty() { 
    return name; 
} 

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

public void addValue(Double val) { 
    values.add(new SimpleDoubleProperty(val)); 
} 

public Object getFirstValue() { 
    return values.get(0).getValue(); 
} 

public Object getValue(int count) { 
    return values.get(count).getValue(); 
} 

public Property<Number> getFirstProperty(){ 
    return this.values.get(0); 
} 
public Property<Number> getSecondProperty(){ 
    return this.values.get(1); 
} 
public Property<Number> getThirdProperty(){ 
    return this.values.get(2); 
} 

public Property<Number> getProperty(int count){ 
    return this.values.get(count); 
} 

} 

방법 바인딩 :

private <S, T> TableColumn<S,T> createCol(String title, 
              Function<S,ObservableValue<T>> propertySelector, 
              StringConverter<T> converter, 
              boolean editable) { 

    TableColumn<S,T> col = new TableColumn<>(title); 
    col.setEditable(editable); 
    col.setCellFactory(TextFieldTableCell.forTableColumn(converter)); 
    col.setCellValueFactory(cellData -> propertySelector.apply(cellData.getValue())); 
    return col ; 
} 

금지 된 바인딩 :

private void initializeTableViewCellFactoryListeners(ChartData chartData) { 
    chartDataTableView.getColumns().clear(); 
    chartDataTableView.getItems().clear(); 

    // test end. 
    DefaultStringConverter def = new DefaultStringConverter(); 
    NumberStringConverter num = new NumberStringConverter(); 

    // build columns dynamically!? 
    chartDataTableView.getColumns().add(createCol("Name", Data::nameProperty, def, false)); 

    chartDataTableView.getColumns().add(createCol("Val1", Data::getFirstProperty, num, true)); 
    //chartDataTableView.getColumns().add(createCol("Val2", Data::getSecondProperty, num, true)); 
    //chartDataTableView.getColumns().add(createCol("Val3", Data::getThirdProperty, num, true)); 
} 

Data :: getXXXProperty 대신 Data.getProperty (n) 메서드를 전달하는 방법은 무엇입니까? 도움

답변

1

나는 완전히 당신이 요구하는지 이해하지 확실히

감사의 : 당신은 그래, 난이 일을 찾고 있었다

chartDataTableView.getColumns().add(createCol("Val1", 
    data -> data.getProperty(n), 
    num, true)); 
+0

찾고 있습니다. 감사. – Andrew

관련 문제