2014-09-25 35 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,但它会带我相当多的时间比我要看看如果这种方法会更好地工作(或根本没有...)。

相关问题