Javafx tableview包含来自多个类的数据

我用1类不同的数据填充我的tableview没有问题。 但是对于我来说,多个class级并不适用。 知道如何解决这个问题吗? 我在stackoverflow上检查了类似的问题。 但他们都不能帮助我。 如果您对“Callback”类提出任何建议,请向我提供完整的导入,因为那里有几个Callback类。

public class MainViewController implements Initializable { @FXML private TableColumn colErledigt; @FXML private TableColumn colPrioritaet; @FXML private TableColumn colBeschreibung; @FXML private TableColumn colProjekt; @FXML private TableView tblView; public final void initialize(final URL location, final ResourceBundle resources) { initializeTableElements(); } public final void initializeTableElements() { colBeschreibung .setCellValueFactory(new PropertyValueFactory("description")); colPrioritaet .setCellValueFactory(new PropertyValueFactory("priority")); colProjekt.setCellValueFactory(new PropertyValueFactory("name")); colErledigt.setMaxWidth(50); colErledigt.setCellValueFactory( new PropertyValueFactory("isDone")); colErledigt .setCellFactory(CheckBoxTableCell.forTableColumn(colErledigt)); colErledigt.setEditable(true); try { tblView.setItems(getObsTasks()); } catch (IDNotValidException | StringNotValidException e1) { System.out.print("FEHLER beim getObsTasks"); } tblView.setEditable(true); } public ObservableList getObsTasks() throws IDNotValidException, StringNotValidException { ObservableList obsTasks = FXCollections .observableArrayList(); Map<Context, Set> test = TasksContextUtility.INSTANCE .getAllContextsAndTasks(); test.values().forEach(v -> { v.forEach(b -> obsTasks.add((TaskControl) b)); }); return obsTasks; } 

进一步的问题:如何在TableCell中的HashSet中显示实例的某个属性。 所以我在TaskControl类中有一个HashSet。 在该HashSet中有“ProjectControl”类的实例。 ProjectControl的每个实例都具有“name”或“id”等属性。

如果可能的话,我想在1个单表格单元格中表示项目实例的所有名称。 也许是一个用逗号分隔的字符串(project1,project2,project3 ……)。

任务类(缩短了很多)我的TaskControl类inheritance自这个类

 public abstract class Task implements Serializable, IDValidatable { private int id; private char priority = ' '; private final Set projects = new HashSet(); public Task(int oid) throws IDNotValidException { if (isIDValid(oid)) { this.id = oid; } else { throw new IDNotValidException("The ID you have specified is not valid!") { private static final long serialVersionUID = 99044660889990790L; }; } } public final void setId(int oid) throws IDNotValidException { if (isIDValid(oid)) { this.id = oid; } else { throw new IDNotValidException("The ID you have specified is not valid!") { private static final long serialVersionUID = 99044660889990790L; }; } } public final int getId() { return this.id; } public final Collection getContexts() { return this.contexts; } public final void addContext(Context context) throws ContextNotValidException { this.contexts.add(context); } public final void removeContext(Context context) throws ContextNotValidException { this.contexts.remove(context); } public final Collection getProjects() { return this.projects; } public final void addProject(Project project) throws ProjectNotValidException { this.projects.add(project); } public final void removeProject(Project project) throws ProjectNotValidException { this.projects.remove(project); } public final Map getAddons() { return this.addons; } } 

在我的选择中,你只有一个很好的解决方案。

你需要一个额外的Class来保存你的TaskControl,ContextControl和ProjectControl。

您的代码看起来像这样。

 class Wrapper{ private TaskControl taskControl; private ContextControl contextControl; private ProjectControl projectControl; ... public Boolean isDone(){ return taskControl != null ? taskControl.isDone() : null; } } @FXML private TableView tblView; @FXML private TableColumn colErledigt; colErledigt.setCellValueFactory( new PropertyValueFactory("isDone")); 

通过向我的TaskControl添加一个额外的String来解决它,它包含它包含的所有项目的名称。 它通过我在为表列创建ObservableList之前调用的函数获取名称。

 private String projectsAsString; ... public final void convertProjectsToString() { String projects = ""; for (Project p : this.getProjects()) { ProjectControl pp = (ProjectControl) p; projects += pp.getName() + ", "; } if (projects != null && projects != "" && projects.length() > 4) { projects = projects.substring(0, projects.length() - 2); } this.projectsAsString = projects; } 

无论如何,谢谢你们帮助我。