Model mit Models füllen

Gerald

Mitglied
Guten Tag und hallo!

Seit einiger Zeit versuche ich mich in Java-Programmierung. Bis jetzt habe ich
dabei beinahe alle Probleme lösen können. Nun komme ich aber nicht weiter.
Im Internet konnte ich bis jetzt keine Hilfe finden, auch in diesem Forum war
nichts zu finden.

Ich will ein "Ober-"Model füllen das aus "Unter-"Modeln unterschiedlicher Größe
besteht.
Das Füllen scheint zu klappen. Aber es ist mir unklar, warum sich nach dem
Füllen der Models scheinbar das letzte eingefügte "Unter-"Model "durchsetzt"
- soll heißen, beim Füllen sind die "Unter-"Models unterschiedlich lang, doch
beim abschließenden Schleifedurchlaufen haben alle "Unter-"Models die gleiche
Länge.
Woran liegt das?

Für Hilfe bin ich dankbar.
Gerald

Java:
public class ListItem {
    private int nr;
    private String name;
    public ListItem (int nr, String name) {
        this.nr = nr;
        this.name = name;
    }
    public String getTitle () {
        return name;
    }
}
Java:
import javax.swing.DefaultListModel;
public class ListItemSuper {
    private int mdlNr;
    DefaultListModel<ListItem> model;
    public ListItemSuper (int mdlNr, DefaultListModel<ListItem> model) {
        this.mdlNr = mdlNr;
        this.model = model;
    }
    public int getM_Nr () {
        return mdlNr;
    }
}
Java:
import javax.swing.DefaultListModel;

public class ModelTest {
    public static void main(String[] args) {
        DefaultListModel<ListItem> mod;
        DefaultListModel<ListItemSuper> modSuper;
        int i, j, k, sm, md, n;
        mod = new DefaultListModel<>();
        modSuper = new DefaultListModel<>();

        for (i = 0; i < 4; i++) {
            mod.add(i, new ListItem(i, i + ".name"));
            modSuper.add(i, new ListItemSuper(i, mod));

            System.out.println("mod.size: "
                             + modSuper.getElementAt(i).model.getSize());
            for (n = 0; n < mod.getSize(); n++)
                System.out.println("Element: " + modSuper.getElementAt(i)
                                          .model.getElementAt(n).getTitle());
            System.out.println();
        }
        sm = modSuper.getSize(); System.out.println("modSuper.size: " + sm);
        for (j = 0; j < sm; j++) {
            k = modSuper.getElementAt(j).getM_Nr();
            System.out.println("Nr: " + k);

            md = modSuper.getElementAt(j).model.getSize();
            System.out.println("modSuper.ElementAt(" + j
                                                 + ").mod.size: " + md);
            for (n = 0; n < md; n++)
                System.out.println("Element: " + modSuper.getElementAt(j)
                                          .model.getElementAt(n).getTitle());
        }
    }
}
 
Ich bin nicht sicher, ob ich deine Problembeschreibung richtig verstanden habe.

Aber du übergibst dem ListItemSuper Kontruktor immer das Listen-Objekt.
D.h. es gibt bei dir eine Instanz "mod", in die alle ListItems eingefügt werden. Dieses eine "mod" wird bei jedem Konstruktor-Aufruf von ListItemSuper übergeben und im erzeugten Objekt gemerkt.
Also zeigen alle ListItemSuper Objekte die gleiche "model" Liste.
 
Hallo Dompteur,
ich denke Du hast richtig verstanden. Glaube auch, daß ich Deine Antwort verstehe.
In der 1. Schleife wird also nur ein neugefülltes "mod" angezeigt, es ist aber doch immer das selbe. Ich müßte jedoch ein eigenständiges "mod" erzeugen? Ja!
Danke!
 
So ist es. Jedesmal, wenn du ein ListItemSuper Objekt erzeugst, müsstest du vorher ein mod Objekt erzeugen und befüllen.

Alternativ dazu kannst du im Konstruktur die übergebene Liste kopieren. Das würde das Verhalten deiner Klasse ändern. Aber vielleicht wäre das ohnehin gewollt ?
 
Im Konstruktor kopieren, kopierendes Übergeben ist nicht möglich - denke ich.
Hab´s noch nicht gemacht, bis jetzt war das nur Theorie. - Aber bald.
Vielen Dank Dompteur für Deine Ratschläge!
 
Kopieren im Konstruktor:
Java:
    public ListItemSuper (int mdlNr, DefaultListModel<ListItem> model) {
        int ii;
        this.mdlNr = mdlNr;
        if (this.model == null)
            this.model = new DefaultListModel<>();
        else
            this.model.setSize(0);
        for (i = 0; i < model.getSize(); i++)
            this.model.add(i, new ListItem(i, model.getElementAt(i).getTitle()));
        System.out.println("size(im Konstruktor): " + this.model.getSize());
    }
 
Die Abfrage "if (this.model == null)" im Konstruktor ist unnötig.
Wenn du das schon absichern willst, dann wäre schon eher zu prüfen, ob der übergebene Parameter "model" ungleich null ist.

Aber abgesehen davon, ist es das, was ich gemeint habe.
Nun noch die Frage : Funktioniert es nun so wie du wolltest ?
 
Ja, es funktioniert wie gewünscht.

Nun will ich aber doch noch wissen wie der Konstruktor sauber gestaltet wird.
Das Prüfen auf "model" == null halte ich für überflüssig, da wegen "i < model.getSize()" die Schleife ggf. nie durchlaufen wird.
Java:
    public ListItemSuper (int mdlNr, DefaultListModel<ListItem> model) {
        int i;
        this.mdlNr = mdlNr;
        this.model = new DefaultListModel<>();        // notwendig? ergibt immer "this.model.getSize == 0"?
        for (i = 0; i < model.getSize(); i++)
            this.model.add(i, new ListItem(i, model.getElementAt(i).getTitle()));
    }
 
Die Prüfung des Parameters "model" auf null ist nötig, da sonst in for-Schleifen-Kopf "model.getSize()" eine NullPointerException auslöst.
 

Zurück
Oben