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