Таблица Javafx с данными из нескольких классов
У меня нет проблем с заполнением моего табличного представления различными данными из 1 класса. Но это не работает для меня с несколькими классами. Есть идеи, как это решить? Я проверил подобные вопросы на stackru. Но никто из них не мог мне помочь. Если вы предлагаете что-нибудь с классом "Обратный вызов", пожалуйста, предоставьте мне полный импорт, потому что есть пара классов Обратного вызова.
public class MainViewController implements Initializable {
@FXML
private TableColumn<TaskControl, Boolean> colErledigt;
@FXML
private TableColumn<TaskControl, Character> colPrioritaet;
@FXML
private TableColumn<TaskControl, String> colBeschreibung;
@FXML
private TableColumn<ProjectControl, String> colProjekt;
@FXML
private TableView<TaskControl> 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<TaskControl, Boolean>("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<TaskControl> getObsTasks()
throws IDNotValidException, StringNotValidException {
ObservableList<TaskControl> obsTasks = FXCollections
.observableArrayList();
Map<Context, Set<Task>> test = TasksContextUtility.INSTANCE
.getAllContextsAndTasks();
test.values().forEach(v -> {
v.forEach(b -> obsTasks.add((TaskControl) b));
});
return obsTasks;
}
Следующий вопрос: как я могу показать определенный атрибут экземпляра в HashSet в TableCell. Итак, у меня в классе TaskControl есть HashSet. В этом HashSet есть экземпляры класса "ProjectControl". Каждый экземпляр ProjectControl имеет такие атрибуты, как "имя" или "идентификатор" и т. Д.
И я хочу представить все имена экземпляров проекта в одной ячейке таблицы, если это возможно. Может быть, как строка, разделенная запятыми (project1,project2,project3...).
Класс задач (значительно сокращен), мой класс 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;
}
}
2 ответа
Решил это, добавив дополнительную строку в мой 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, 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"));