Befüllung einer Tabelle mit Checkbox, Trennung GUI und Model

Wolfone

Mitglied
Hallo liebe Forumler,

ich habe folgendes Problem.
Ich möchte zu Terminen, die ich in einer Tabelle anzeige (das funktioniert schon gut), potentiell Checklisten anlegen, die in einer weiteren Tabelle angezeigt werden.
Diese Checklistentabelle hatte ich so befüllt:
Java:
[...]
        checkpointSpalte.setCellValueFactory(cellData -> cellData.getValue().getCheckpoint());
        checkboxSpalte.setCellValueFactory(cellData -> cellData.getValue().getCheckBoxProperty());
[...]
Dabei liefert getCheckBoxProperty eine ObjectProperty<CheckBox>. Ich bin in diesem Thread:
http://www.java-forum.org/thema/problemabhaengige-persistentmachung-von-daten.173877/#post-1096701 darauf hingewiesen worden, dass das keine gute Praxis ist, was ich einsehe. Das ist ein Punkt, an dem ich die Trennung von GUI und Model nicht konsequent durchgezogen habe.
Das möchte ich verbessern. Allerdings bin ich noch Anfänger und bin da auf mehr Probleme gestoßen, als ich erwartet hätte.
Die Idee war, statt der CheckBox in meiner ChecklistItem-Klasse einfach einen boolschen Wert zu speichern (checked) in Form einer SimpleBooleanProperty und über dessen Wahrheitswert die Tabelle mit CheckBoxen zu befüllen.

Nach etwas naivem Getüftel war mein Versuch die zweite obere Zeile durch folgendes zu ersetzen:
Code:
checkboxSpalte.setCellValueFactory(cellData -> {
            boolean value = cellData.getValue().getCheckedProperty();
            CheckBox check = new CheckBox();
            check.setSelected(value);
            return (ObservableValue<CheckBox>) check;
        });
Dieser Cast funktioniert allerdings so nicht und ich bin auch sehr unsicher, ob das eine intelligente Herangehensweise in Hinsicht auf das oben genannte Ziel der Hintergrundveränderung ist. Weiterhin beinhaltet das ja auch noch nicht den Abgleich zwischen Checkbox und zugehörigem boolschen Wert des ChecklistItems.

Ich wäre dankbar für Hilfe wie ich dort mit gutem Stil und zielorientiert vorgehen sollte!

Beste Grüße
Wolf
 
Ich finde, eine "UseStory" wäre hilfreich. Ich spinne mal: Ein Außendienstler macht ein Angebot für einen Kunden. Das Angebot besteht aus mehreren Dokumenten. Das System soll nun die Daten des Auftraggebers, den Folgetermin beim Auftraggeber und den Fortgang bei der Erstellung der Dokumente( Dokument in Bearbeitung/erstellt) speichern. In dieser Konstellation würde ich zusätzlich ein Objekt Auftrag erstellen. Dann kann ein Auftraggeber einen Auftrag erstellen, dieser hat einen Termin und zum Auftrag gehören mehrere Dokumente, die sich in unterschiedlichen Bearbeitungsphasen befinden.
Nun kann man diese Daten in der GUI anzeigen. Ist das so das, was du willst?
 
Ich finde, eine "UseStory" wäre hilfreich. Ich spinne mal: Ein Außendienstler macht ein Angebot für einen Kunden. Das Angebot besteht aus mehreren Dokumenten. Das System soll nun die Daten des Auftraggebers, den Folgetermin beim Auftraggeber und den Fortgang bei der Erstellung der Dokumente( Dokument in Bearbeitung/erstellt) speichern. In dieser Konstellation würde ich zusätzlich ein Objekt Auftrag erstellen. Dann kann ein Auftraggeber einen Auftrag erstellen, dieser hat einen Termin und zum Auftrag gehören mehrere Dokumente, die sich in unterschiedlichen Bearbeitungsphasen befinden.
Nun kann man diese Daten in der GUI anzeigen. Ist das so das, was du willst?
Woher hast du das mit dem Auftrag und den Dokumenten? AFAIK hat der TE nur Termine und hat für diese Termine Checklisten.

@TE:
Ich gehe mal davon aus, dass nur die GUI dein Datenmodell ändern soll. Dann reicht es nämlich, wenn du auf Änderungen in der GUI reagierst und dann das Datenmodell änderst. Falls nicht musst du auch auf Änderungen im Datenmodell reagieren und dann die GUI aktualisieren (und das ist natürlich mehraufwand).

Folgender PseudoCode:
Java:
JCheckBox checkbox = /* checkbox erstellen, wie auch immer */;
checkbox.setSelected(checklistenEintrag.isDone()); // #isDone hab ich mir jetzt ausgedacht; hier halt den getter deiner ist-erledigt-Eigenschaft im Datenmodell nehmen

checkbox.addChangeListener(chEv -> checklistenEintrag.setDone(checkbox.isSelected()); // hier das selbe mit #setDone

Damit sollte das eigentlich schon getan sein.
 
@Tobse: So wie ich das verstanden habe, besitzt der TE noch gar kein Datenmodell, sondern nur Daten, die seine GUI befüllen. Ich mag mich natürlich auch irren. Mein Beitrag war deshalb eine Hilfestellung, wie er ein Datenmodell entwickeln kann. Im Norddeutschen heißt "ich spinne mal:" soviel wie "ich denke mir mal was aus:". Wenn der TE Datenmodell und GUI tzrennen will, dann muss er diese beide doch auch getrennt für sich betrachten, hätte ich gedacht.
 
Hallo allerseits!

Zunächst Entschuldigung für die späte Antwort, das ist meiner Lebensrealität und der daraus resultierenden fehlenden Muße geschuldet.

Ich denke ich habe mein Problem im ersten Post nicht präzise genug gefasst es tut mir Leid, wenn ich damit unnötige Arbeit verursacht habe. Ich versuche das zu verbessern:
das Problem liegt beim Befüllungsprozess der Checkboxspalte. Das Datenmodell habe ich soweit schon, aber in der "funktionierenden" Variante ist es nicht gut, daraus resultiert eine Veränderung, die bewirkt, dass ich das Befüllen nicht mehr ordentlich schaffe. Kurz umrissen:

Vorher (schelchte Variante): Jedes Checklistendatenobjekt enthielt eine checked/ unchecked Checkbox, die Befüllung der Tabelle funktionierte, aber eine Checkbox ist ein GUI-Element und sollte nicht ins Datenmodell.

Für die Zukunft gewünscht (bessere Variante): Speicherung eines Wahrheitswerts statt der Checkbox im Datenmodell, Erzeugung der Checkboxen außerhalb des Datenmodells. Setzen von checked/unchecked mittels des Wahrheitswertes.

Ich bekomme es aber nach der Änderung des Datenmodells nicht mehr hin meine Tabelle mit checkboxen zu befüllen, was vielleicht den folgenden Codeschnipsel aus dem ersten Post besser erklärt. Das war ein Versuch von mir das Erzeugen und Befüllen zu erreichen, der aber erfolglos blieb.
Code:
checkboxSpalte.setCellValueFactory(cellData -> {
            boolean value = cellData.getValue().getCheckedProperty();
            CheckBox check = new CheckBox();
            check.setSelected(value);
            return (ObservableValue<CheckBox>) check;
        });

Mein Problem liegt also eher darin, dass die GUI nicht merh richtig arbeitet, nachdem ich das Datenmodell geändert habe.

Beste Grüße
Wolf
 

Zurück
Oben