如何使用动态生成的不同类型的列创建tableview?

时间:2017-05-27 19:31:20

标签: java javafx tableview javafx-2

我正在制定一个学生会计考勤方案。我需要一个包含第一列的表 - 学生列表(TableColumn)和我动态生成的下一列(讲座列表)。在行和列的交叉点 - ComboBox。我找到了如何动态生成一种类型的列(TableView>>),但没有为我的案例找到解决方案。 我有一个想法来创建一个额外的类

class Row{
    StringProperty audience;
    ObservableList<Attendence> lectures;
}

但不明白如何实现它。 如何解决这个问题??

1 个答案:

答案 0 :(得分:2)

你的想法基本上是正确的:

public class Row{
    private final StringProperty audience = new SimpleStringProperty();
    private final List<ObjectProperty<Attendance>> lectures = new ArrayList<>();

    public Row(String audience, int numAttendances) {
        setAudience(audience);
        for (int i = 0 ; i < numAttendances ; i++) {
            lectures.add(new SimpleObjectProperty<>());
        }
    }

    public List<ObjectProperty<Attendance>> getLectures() {
        return lectures ;
    }

    public StringProperty audienceProperty() { 
        return audience ;
    }

    public final String getAudience() {
        return audienceProperty().get();
    }

    public final void setAudience(String audience) {
        audienceProperty().set(audience);
    }
}

现在您可以按如下方式设置表格:

int numLectures = ... ;
TableView<Row> table = new TableView<>();
TableColumn<Row, String> audienceCol = new TableColumn<>("Audience");
audienceCol.setCellValueFactory(cellData -> cellData.getValue().audienceProperty());
table.getColumns().add(audienceCol);
for (int i = 0 ; i < numLectures ; i++) {
    TableColumn<Row, Attendance> col = new TableColumn<>("Attendance "+ (i+1));
    final int colIndex = i ;
    col.setCellValueFactory(cellData -> cellData.getValue().getLectures().get(colIndex));
    table.getColumns().add(col);
}