Dynamic Javafx动态表

Dynamic Javafx动态表,dynamic,javafx,tableview,Dynamic,Javafx,Tableview,我想用TableView类创建动态表 我将列数(int)、列名(String[])和行数(Student)发送给承包商,但我无法处理这些。 我需要如何为每一列定义TableColumn public class DynamicTable extends TableView<Student>{ private ObservableList<Student> data; private int columnCount; private String[] columnName

我想用TableView类创建动态表

我将列数(int)、列名(String[])和行数(Student)发送给承包商,但我无法处理这些。 我需要如何为每一列定义TableColumn

public class DynamicTable extends TableView<Student>{

private ObservableList<Student> data;
private int columnCount;
private String[] columnName;
private TableView<Student> tableView;

DynamicTable(){

}
DynamicTable(int columnCount, Student[] rows, String[] columnName){

    this.columnName=columnName;
    this.columnCount=columnCount;
    data = FXCollections.observableArrayList();
    setData(rows);
}

public void buildTable(){

    for(int i=0 ; i<columnCount; i++){
        final int j=i;
        TableColumn<Student,String> col = new TableColumn<Student,String>(columnName[i]); 

        //col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Student,String>, ObservableValue<String>>() {

            //@Override
            //public ObservableValue<String> call(
                //  CellDataFeatures<Student, String> param) {

            //  return new SimpleStringProperty(param.getValue().getAddress());
        //  }
        //});
        tableView.getColumns().addAll(col);

        tableView.setItems(data);
    }
}

public void setData(Student[] rows){
    data.setAll(rows);

}
public String[] getColumnName(){
    return this.columnName;
}
}
public类DynamicTable扩展了TableView{
私有可观测列表数据;
私有int列计数;
私有字符串[]列名称;
私有TableView TableView;
动态的{
}
DynamicTable(int columnCount、Student[]行、String[]columnName){
this.columnName=columnName;
this.columnCount=columnCount;
data=FXCollections.observearraylist();
设置数据(行);
}
公共void buildTable(){

对于(int i=0;i首先,您需要向
Student
类添加属性访问器方法:

public class Student {

    private final SimpleStringProperty firstName ;
    // etc ...

    public String getFirstName() {
        return firstName.get();
    }

    public void setFirstName(String firstName) {
        this.firstName.set(firstName);
    }

    // Add methods like this:

    public StringProperty firstNameProperty() {
        return firstName ;
    }

    // ... etc
}
然后,您的单元格值工厂将如下所示:

TableColumn<Student,String> col = new TableColumn<Student,String>(columnName[i]);
col.setCellValueFactory(cellData -> {
    Student student = cellData.getValue();
    return student.xxxProperty();
});
TableColumn col=新的TableColumn(columnName[i]);
col.setCellValueFactory(cellData->{
Student=cellData.getValue();
返回学生。xxxProperty();
});

替换
xxxProperty()的位置
的实际属性,该属性的值要显示在该列中。

表中的每一行表示一个
Student
对象。因此,每一列都必须定义如何将
Student
对象映射到要显示在单元格中的值。现在,关于这些列的所有信息都是名称和索引。您的
Student
类的外观以及如何使用列名和/或索引从
Student
中获取值以显示在单元格中?@James_D我添加了Student类。好的,好的,但您还需要回答我的第二个问题:给定单元格中将显示什么?现在您对该单元格的所有了解是:a
Student
表示单元格所在行的对象。A
字符串
表示列标题文本。列的索引。您需要从该信息获取单元格的值。@James\u D如何定义映射?通过Student类上的“get”函数?谢谢。那么“tableView.getColumns().addAll(col)”呢?因为我想成为一个动态表,“单元格值工厂”在for循环中,我创建了“get”函数来获取列的索引并返回列的StringProperty。对不起,我不知道你的意思。我需要使用“addAll(col)”,用于添加列?是的,您仍然需要该行。因为您一次只添加一行,所以您可以执行
add(…)
而不是
addAll(…)
。我得到了以下示例:“javaNetFinal.DaynamicTable.buildTable(DynamicTable.java:40)的应用程序启动方法java.lang.NullPointerException中的异常”:(
TableColumn<Student,String> col = new TableColumn<Student,String>(columnName[i]);
col.setCellValueFactory(cellData -> {
    Student student = cellData.getValue();
    return student.xxxProperty();
});