2015-03-04 7 views
1

Я хочу создать динамическую таблицу с классом TableView.Javafx dynamic Таблица

Я посылаю подрядчику количество столбцов (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; 
} 
} 

Я буду рад получить ваш ответ.

Edit: класс Student:

public class Student implements Externalizable 
    { 
    private final SimpleIntegerProperty ID; 
    private final SimpleStringProperty firstName; 
    private final SimpleStringProperty lastName; 
    private final SimpleStringProperty address; 
    private final SimpleObjectProperty<Date> birthDate; 
    private final SimpleStringProperty department; 
    private final SimpleIntegerProperty pointsAmount; 
    private final SimpleObjectProperty<Date> startStudyingDate; 
    private final SimpleIntegerProperty failedAmount; 
    private final SimpleDoubleProperty average; 
    private final SimpleIntegerProperty lavelByGrade; 
    private final SimpleStringProperty pic; 

    public Student(){ 

     this.ID = new SimpleIntegerProperty(); 
     this.firstName= new SimpleStringProperty(); 
     this.lastName= new SimpleStringProperty(); 
     this.address= new SimpleStringProperty(); 
     this.birthDate= new SimpleObjectProperty<Date>(); 
     this.department= new SimpleStringProperty(); 
     this.pointsAmount= new SimpleIntegerProperty(); 
     this.startStudyingDate= new SimpleObjectProperty<Date>(); 
     this.failedAmount= new SimpleIntegerProperty(); 
     this.average= new SimpleDoubleProperty(); 
     this.lavelByGrade= new SimpleIntegerProperty(); 
     this.pic = new SimpleStringProperty(); 
    } 

    public Student(int ID, String firstName, String lastName, String address, 
      Date birthDate, String department, 
      int pointsAmount, Date startStudyingDate, int failedAmount, 
      double average, int lavelByGrade, String pic){ 

     this.ID= new SimpleIntegerProperty(ID); 
     this.firstName= new SimpleStringProperty(firstName); 
     this.lastName= new SimpleStringProperty(lastName); 
     this.address= new SimpleStringProperty(address); 
     this.birthDate= new SimpleObjectProperty<Date>(birthDate); 
     this.department= new SimpleStringProperty(department); 
     this.pointsAmount= new SimpleIntegerProperty(pointsAmount); 
     this.startStudyingDate= new SimpleObjectProperty<Date>(startStudyingDate); 
     this.failedAmount= new SimpleIntegerProperty(failedAmount); 
     this.average= new SimpleDoubleProperty(average); 
     this.lavelByGrade= new SimpleIntegerProperty(lavelByGrade); 
     this.pic = new SimpleStringProperty(pic); 
    } 

    public int getID() { 
     return ID.get(); 
    } 
    public void setID(int ID) { 
     this.ID.set(ID); 
    } 

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

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

    public String getLastName() { 
     return lastName.get(); 
    } 

    public void setLastName(String lastName) { 
     this.lastName.set(lastName); 
    } 

    public String getAddress() { 
     return address.get(); 
    } 

    public void setAddress(String address) { 
     this.address.set(address); 
    } 

    public Date getBirthDate() { 
     return birthDate.get(); 
    } 

    public void setBirthDate(Date birthDate) { 
     this.birthDate.set(birthDate); 
    } 

    public String getDepartment() { 
     return department.get(); 
    } 

    public void setDepartment(String department) { 
     this.department.set(department); 
    } 

    public int getPointsAmount() { 
     return pointsAmount.get(); 
    } 

    public void setPointsAmount(int pointsAmount) { 
     this.pointsAmount.set(pointsAmount); 
    } 

    public Date getStartStudyingDate() { 
     return startStudyingDate.get(); 
    } 

    public void setStartStudyingDate(Date startStudyingDate) { 
     this.startStudyingDate.set(startStudyingDate); 
    } 

    public int getFailedAmount() { 
     return failedAmount.get(); 
    } 

    public void setFailedAmount(int failedAmount) { 
     this.failedAmount.set(failedAmount); 
    } 

    public double getAverage() { 
     return average.get(); 
    } 

    public void setAverage(Double average) { 
     this.average.set(average); 
    } 

    public int getLavelByGrade() { 
     return lavelByGrade.get(); 
    } 

    public void setLavelByGrade(int lavelByGrade) { 
     this.lavelByGrade.set(lavelByGrade); 
    } 

    public String getPic() { 
     return pic.get(); 
    } 

    public void setPic(String pic) { 
     this.pic.set(pic); 
    } 

    @Override 
    public void readExternal(ObjectInput in) throws IOException, 
    ClassNotFoundException { 

     setID(in.readInt()); 
     setFirstName((String)in.readObject()); 
     setLastName((String)in.readObject()); 
     setAddress((String)in.readObject()); 
     setBirthDate((Date)in.readObject()); 
     setDepartment((String)in.readObject()); 
     setPointsAmount(in.readInt()); 
     setStartStudyingDate((Date)in.readObject()); 
     setFailedAmount(in.readInt()); 
     setAverage(in.readDouble()); 
     setLavelByGrade(in.readInt()); 
     setPic((String)in.readObject()); 
    } 

    @Override 
    public void writeExternal(ObjectOutput out) throws IOException { 

     out.writeInt(getID()); 
     out.writeObject(getFirstName()); 
     out.writeObject(getLastName()); 
     out.writeObject(getAddress()); 
     out.writeObject(getBirthDate()); 
     out.writeObject(getDepartment()); 
     out.writeInt(getPointsAmount()); 
     out.writeObject(getStartStudyingDate()); 
     out.writeInt(getFailedAmount()); 
     out.writeDouble(getAverage()); 
     out.writeInt(getLavelByGrade()); 
     out.writeObject(getPic()); 

    } 

} 
+0

Каждая строка в таблице представляет собой объект «Студент». Поэтому каждый столбец должен определить, как сопоставить объект «Студент» в значение, отображаемое в ячейке. Сейчас все, что вы знаете о столбцах, - это имя и индекс. Как выглядит ваш класс «Студент» и как будет использоваться имя столбца и/или индекс, чтобы получить значение из «Студента» для отображения в ячейке? –

+0

@James_D Я добавил ученический класс. – Ramz

+0

Хорошо, хорошо, но вам также нужно ответить на мой второй вопрос: что будет отображаться в данной ячейке? Сейчас все, что вы знаете об этой ячейке, это: «Объект« Студент », представляющий строку, в которой находится ячейка.« Строка », представляющая текст заголовка столбца. Индекс столбца. Вам нужно получить от этой информации значение для ячейки. –

ответ

1

Во-первых, вам нужно добавить методы доступа к свойствам к вашему 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(); 
}); 

Где вы меняете xxxProperty() с помощью переменного тока tual, значение которого вы хотите отобразить в этом столбце.

+0

Спасибо. А как насчет «tableView.getColumns(). AddAll (col)» ?. Поскольку я хочу быть динамической таблицей, «фабрика значений ячеек» находится в цикле, и я создал функцию «get», которая получает индекс столбца и возвращает StringProperty из него. – Ramz

+0

Извините, я понятия не имею, что вы имеете в виду. –

+0

Мне нужно использовать «addAll (col)», для добавления столбцов? – Ramz

Смежные вопросы