2014-09-25 45 views
0

顯示TreeTableView我有兩個類:如何與T對象的列表作爲子項目

Project      Employee    Jobtitle 
------------------------- -------------------  ---------------------- 
name: String    firstname: String  title: String 
employees: List<Employee> jobtitle: Jobtitle  hourlyWage: BigDecimal 
          birthday: Date 

如何顯示在如下所示的treetable中編輯值?

Name  fName Title  Birthday 
------------------------------------------ 
-Project A 
      -Tom Programmer 09-12-1980 
      -Peter Accountant 03-04-1970 
-Project B 
-Project D 

我編程以下目前爲止。如何添加列的員工,因爲員工是一個列表?:

TreeItem<Project> root 
       = new TreeItem<>(new Project("Root", null)); 

for (Project project : projectData) { 
    root.getChildren().add(new TreeItem<>(project)); 
} 

TreeTableColumn<Project, String> projectCol 
    = new TreeTableColumn<>("Projects"); 
projectCol.setCellValueFactory((cellData) -> cellData.getValue() 
            .getValue().nameProperty()); 

//Now how can I add columns for Employee? 
//TreeTableColumn<Project, String> projectCol 
// = new TreeTableColumn<>("Firstname"); 
//projectCol.setCellValueFactory((cellData) -> cellData.getValue() 
//         .getValue().employeesProperty()...?); 

TreeTableView<Project> treeTable = new TreeTableView<>(root); 
treeTable.getColumns().add(projectCol); 

的數據來自ObservableLists與我硬編碼值(後來,我將使用JPA獲取數據雙向關係,即這樣你就可以得到項目從員工和其他方面)。

private final ObservableList<Jobtitle> jobtitleData 
      = FXCollections.observableArrayList(
        new Jobtitle("Programer", 60), 
        new Jobtitle("Accountant", 70)); 

private final ObservableList<Person> employeeData 
     = FXCollections.observableArrayList(
       new Person("Jacob", jobtitleData.get(0), new Date()), 
       new Person("Peter", jobtitleData.get(1), new Date()),); 

private final ObservableList<Project> projectData 
     = FXCollections.observableArrayList(
       new Project("Projekt A", employeeData), 
       new Project("Projekt B", employeeData)); 

我讀過tutorial by Oracle,但他們只是涵蓋基本類型。

+0

你的問題是什麼? – talex 2014-09-25 12:18:04

+0

@talex我將問題標記爲粗體。 – haisi 2014-09-25 12:26:44

回答

0

TreeTableView<T>,T是由樹表的每行代表的項目的類型

與您的設置的問題是,你聲明一個TreeTableView<Project>,但不是每一行代表一個Project:一些行表示Project S和一些行表示Employee秒。

沒有特別優雅的解決方案,我可以看到。您可以簡單地聲明TreeTableView<Object>,然後在單元格值工廠中對cellData.getValue()執行一些類型檢查(和向下轉換)以確定如何爲單元格創建適當的值(例如,如果值爲Employeenew ReadOnlyStringWrapper(""),則爲((Employee)value).firstnameProperty()),否則爲new ReadOnlyStringWrapper(""))。雖然這很不理想。

另一種選擇是創建專門用於TreeTableViewProjectEmployeeItem類。你可以這樣做

public class ProjectEmployeeItem { 
    private final StringProperty name = new SimpleStringProperty(this, "name", ""); 
    private final StringProperty firstName new SimpleStringProperty(this, "firstname", ""); 
    private final ObjectProperty<JobTitle> title new SimpleObjectProperty<>(this, "title", null); 
    private final ObjectProperty<LocalDate> birthday new SimpleObjectProperty<>(this, "birthday", null); 

    // property, get, and set methods ... 

    public ProjectEmployeeItem() { 
    } 

    public ProjectEmployeeItem(Project project) { 
     name.bindBidirectional(project.nameProperty()); 
    } 

    public ProjectEmployeeItem(Employee employee) { 
     firstname.bindBidirectional(employee.firstnameProperty()); 
     title.bindBidirectional(employee.titleProperty()); 
     birthday.bindBidirectional(employee.birthdayProperty()); 
    } 
} 

然後創建一個TreeTableView<ProjectEmployeeItem>並做類似

TreeItem<ProjectEmployeeItem> root = new TreeItem<>(new ProjectEmployeeItem()); 
for (Project project : projectData) { 
    TreeItem<ProjectEmployeeItem> projectTreeItem = new TreeItem<>(new ProjectEmployeeItem(project)); 
    for (Employee employee : project.getEmployees()) { 
     TreeItem<ProjectEmployeeItem> employeeTreeItem = new TreeItem<>(new ProjectEmployeeItem(employee)); 
     projectTreeItem.getChildren().add(employeeTreeItem); 
    } 
    root.getChildren().add(projectTreeItem); 
} 

有可能是更好的解決方案,涉及子類TreeItem,但它會帶我相當多的時間比我要看看如果這種方法會更好地工作(或根本沒有...)。

相關問題