具有来自多个类的数据的Javafx tableview

具有来自多个类的数据的Javafx tableview,java,javafx,tableview,tablecolumn,observablelist,Java,Javafx,Tableview,Tablecolumn,Observablelist,我可以用1个类的不同数据填充我的tableview。但它不适用于我的多个类。你知道怎么解决吗? 我在stackoverflow上查到了类似的问题。但是他们都帮不了我。如果您对“Callback”类有任何建议,请提供完整的导入,因为有几个回调类 public类MainViewController实现可初始化{ @FXML 私有表列colErledigt; @FXML 私服; @FXML 私有表列colBeschreibung; @FXML 私有表列colProjekt; @FXML 私人桌面视图t

我可以用1个类的不同数据填充我的tableview。但它不适用于我的多个类。你知道怎么解决吗? 我在stackoverflow上查到了类似的问题。但是他们都帮不了我。如果您对“Callback”类有任何建议,请提供完整的导入,因为有几个回调类

public类MainViewController实现可初始化{
@FXML
私有表列colErledigt;
@FXML
私服;
@FXML
私有表列colBeschreibung;
@FXML
私有表列colProjekt;
@FXML
私人桌面视图tblView;
公共最终无效初始化(最终URL位置,
最终资源包(资源){
initializeTableElements();
}
public final void initializeTableElements(){
科尔贝施雷邦
.setCellValueFactory(新属性ValueFactory(“说明”);
孔雀石
.setCellValueFactory(新财产价值工厂(“优先”);
colProjekt.setCellValueFactory(新属性ValueFactory(“名称”);
colErledigt.setMaxWidth(50);
colErledigt.setCellValueFactory(
新物业价值工厂(“isDone”);
科尔利迪格特
.setCellFactory(CheckBoxTableCell.forTableColumn(colErledigt));
colErledigt.setEditable(true);
试一试{
setItems(getObsTasks());
}捕获(IDNotValidException | StringNotValidException e1){
系统输出打印(“FEHLER beim getObsTasks”);
}
tblView.setEditable(true);
}
公共可观察列表getobbstasks()
抛出IDNotValidException,StringNotValidException{
ObservableList obsTasks=FXCollections
.observableArrayList();
Map test=tasksContextivity.INSTANCE
.getAllContextsAndTasks();
test.values().forEach(v->{
v、 forEach(b->obbstasks.add((TaskControl)b));
});
返回任务;
}
进一步的问题:如何在TableCell的HashSet中显示实例的某个属性。因此,我在TaskControl类中有一个HashSet。在该HashSet中有类“ProjectControl”的实例。ProjectControl的每个实例都有“name”或“id”等属性

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

Task类(缩短了很多)我的TaskControl类继承自该类

public abstract class Task
  implements Serializable, IDValidatable
{
  private int id;
  private char priority = ' ';
  private final Set<Project> 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<Context> 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<Project> 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<String, String> getAddons()
  {
    return this.addons;
  }
}
公共抽象类任务
实现可序列化、可IDValidatable
{
私有int-id;
私有字符优先级=“”;
私有最终集项目=新HashSet();
公共任务(int-oid)
抛出IDNotValidException
{
if(isIDValid(oid)){
this.id=oid;
}否则{
抛出新的IDNotValidException(“您指定的ID无效!”)
{
私有静态最终长serialVersionUID=9904466608899907900L;
};
}
}
公共最终无效集合ID(整数oid)
抛出IDNotValidException
{
if(isIDValid(oid)){
this.id=oid;
}否则{
抛出新的IDNotValidException(“您指定的ID无效!”)
{
私有静态最终长serialVersionUID=9904466608899907900L;
};
}
}
公共final int getId()
{
返回此.id;
}
公共最终集合getContexts()
{
返回这个.context;
}
公共最终void addContext(上下文上下文)
抛出ContextNotValidException
{
this.context.add(context);
}
公共最终void removeContext(上下文)
抛出ContextNotValidException
{
this.context.remove(上下文);
}
公共最终集合getProjects()
{
归还此项目;
}
公共最终项目(项目)
抛出ProjectNotValidException
{
this.projects.add(项目);
}
公共最终作废清除项目(项目)
抛出ProjectNotValidException
{
此.projects.remove(项目);
}
公共最终映射getAddons()
{
返回这个.addons;
}
}

在我看来,您只有一个很好的解决方案

您需要一个额外的类来保存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<Wrapper> tblView;

@FXML
private TableColumn<Wrapper, Boolean> colErledigt;

colErledigt.setCellValueFactory(
            new PropertyValueFactory<Wrapper, Boolean>("isDone"));
类包装器{
专用任务控制任务控制;
私有上下文控制上下文控制;
私人项目控制项目控制;
...
公共布尔isDone(){
return taskControl!=null?taskControl.isDone():null;
}
}
@FXML
私人桌面视图tblView;
@FXML
私有表列colErledigt;
colErledigt.setCellValueFactory(
新物业价值工厂(“isDone”);

在我看来,您只有一个很好的解决方案

您需要一个额外的类来保存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<Wrapper> tblView;

@FXML
private TableColumn<Wrapper, Boolean> colErledigt;

colErledigt.setCellValueFactory(
            new PropertyValueFactory<Wrapper, Boolean>("isDone"));
类包装器{
专用任务控制任务控制;
私有上下文控制上下文控制;
私人项目控制项目控制;
...
公共布尔isDone(){
return taskControl!=null?taskControl.isDone():null;
}
}
@FXML
私人桌面视图tblView;
@FXML
私有表列colErledigt;
colErledigt.setCellValueFactory(
新物业价值工厂(“isDone”);

通过向我的TaskControl添加一个额外的字符串来解决这个问题,该字符串包含它所包含的所有项目的名称。它通过一个函数获取名称,我在为表列创建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;
}

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

通过向我的TaskControl添加一个额外的字符串解决了这个问题,该字符串包含它包含的所有项目的名称。它通过一个函数获取名称,我在为表列创建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;
}
谢谢你们的帮助