Preisabzug nach der Löschung eines Elements aus einer JList mit AbstractListModel

Nico2201

Mitglied
Hallo,

in einer JList werden 3 Elemente eingegeben:
  1. Name (String)
  2. Preis (double)
  3. Datum (String)
Mit Hilfe eines JButtons kann man entweder ein Element oder alle Elemente löschen. Letzteres läuft ohne Probleme, aber bei der ersten Methode komme ich nicht weiter. In einem JTextField (ausgabePreis) werden alle Preiseingaben addiert und als Summe ausgegeben. Wenn man ein Element löscht, dann löscht man logischerweise auch die Preiseingabe und Folge dessen soll diese gelöschte Preiseingabe von der Summe subtrahiert werden. Das klingt vielleicht einfach, aber die Umsetzung ist (für mich) nicht gerade leicht. :cautious: Solltet ihr weitere Codeschnipsel brauchen, stelle ich euch diese gerne zur Verfügung.

Ein Element löschen:
Java:
public void DateiLoeschenEins() {
        
        model.removeElement();
    }

Alle Elemente löschen:
Java:
public void DateiLoeschenAlles() {
        
        model.removeAllElements();
        summe = 0;
        ausgabePreis.setText("");
    }

Vielen Dank für eure Bemühungen!

Freundliche Grüße
 
Lösung
Du solltest dir von deiner Methode removeElement das gelöschte Objekt zurückgeben lassen und damit arbeiten.

Angenommen du hast wie von mir/uns in vorherigen Posts vorgeschlagen das Model mit einer ArrayList implementiert, dass verwendet dein removeElement sicher die Methode:
https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#remove-int-

Die Methode gibt das gelöschte Element zurück.

Ich weiß nun leider nicht, welches Element du löschst, ich nehme nun einmal an du löscht das letzte.

Java:
// deine bereits erwähnt Methode
public void DateiLoeschenEins() {
    Entity removed = model.removeElement();
    double preis = removed.getPreis();
   
    // nun ziehe den Preis von der Summe ab
}

// Methode in deinem...
Du solltest dir von deiner Methode removeElement das gelöschte Objekt zurückgeben lassen und damit arbeiten.

Angenommen du hast wie von mir/uns in vorherigen Posts vorgeschlagen das Model mit einer ArrayList implementiert, dass verwendet dein removeElement sicher die Methode:
https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#remove-int-

Die Methode gibt das gelöschte Element zurück.

Ich weiß nun leider nicht, welches Element du löschst, ich nehme nun einmal an du löscht das letzte.

Java:
// deine bereits erwähnt Methode
public void DateiLoeschenEins() {
    Entity removed = model.removeElement();
    double preis = removed.getPreis();
   
    // nun ziehe den Preis von der Summe ab
}

// Methode in deinem Model
public Entity removeElement() {
    return list.remove(list.size() - 1);
}
 
Du solltest dir von deiner Methode removeElement das gelöschte Objekt zurückgeben lassen und damit arbeiten.

Angenommen du hast wie von mir/uns in vorherigen Posts vorgeschlagen das Model mit einer ArrayList implementiert, dass verwendet dein removeElement sicher die Methode:
https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#remove-int-

Die Methode gibt das gelöschte Element zurück.

Ich weiß nun leider nicht, welches Element du löschst, ich nehme nun einmal an du löscht das letzte.

Java:
// deine bereits erwähnt Methode
public void DateiLoeschenEins() {
    Entity removed = model.removeElement();
    double preis = removed.getPreis();
  
    // nun ziehe den Preis von der Summe ab
}

// Methode in deinem Model
public Entity removeElement() {
    return list.remove(list.size() - 1);
}

Hat alles geklappt. Vielen Dank!
 
2 Hinweis noch von mir..

1) removeElement() ist wirklich dahingehend irreführend, dass die Methode bei der aufrufenden Klasse nicht deutlich macht, was sie löscht. Das letzte Element war bei mir eine Annahme. Falls es wirklich das Letzte oder das Erste ist, wäre es sinnvoll die Methode removeFirstElement() oder removeLastElement() zu benennen. Einfach der Les- und Wartbarkeit halber.

2) Ich habe in meinem Beispiel vergessen, dass die Methode sicher auch ein Event (nach dem Entfernen) feuern muss. Bitte bei Bedarf ergänzen.
 
2 Hinweis noch von mir..

1) removeElement() ist wirklich dahingehend irreführend, dass die Methode bei der aufrufenden Klasse nicht deutlich macht, was sie löscht. Das letzte Element war bei mir eine Annahme. Falls es wirklich das Letzte oder das Erste ist, wäre es sinnvoll die Methode removeFirstElement() oder removeLastElement() zu benennen. Einfach der Les- und Wartbarkeit halber.

2) Ich habe in meinem Beispiel vergessen, dass die Methode sicher auch ein Event (nach dem Entfernen) feuern muss. Bitte bei Bedarf ergänzen.

So wie ich das verstanden habe, muss ich noch fireIntervalRemoved(source, index0, index1); in die removeElement() Methode implementieren, richtig? Wenn ja, das habe ich gemacht, aber dann wird fireIntervalRemoved(source, index0, index1); rot unterkringelt und dann steht da "Unreachable code", sodass ich den Code logischerweise löschen muss. Ich habe das folgendermaßen gemacht: fireIntervalRemoved(this, 0, list.size() - 1);

P.S.: removeElement() funktioniert auch ohne fireIntervalRemoved(source, index0, index1);. Demnach würde ich sagen, dass man das nicht zwangsläufig braucht, oder?
 
Deine Summe wird sicherlich geupdated. Das Fire-Event ist für das Updaten der Liste in der GUI. Vermutlich siehst du es hier noch vorübergehend, hast aber eventuell nicht darauf geachtet. fireIntervalRemoved(...) wäre richtig.

Um es nach dem entfernen zu feuern darfst du nicht mehr remove im return statement machen, sondern du brauchst 3 Zeilen:
- Element entfernen und in einer lokalen Variable speichern
- Event feuern
- lokale Variable returnen
 
Deine Summe wird sicherlich geupdated. Das Fire-Event ist für das Updaten der Liste in der GUI. Vermutlich siehst du es hier noch vorübergehend, hast aber eventuell nicht darauf geachtet. fireIntervalRemoved(...) wäre richtig.

Um es nach dem entfernen zu feuern darfst du nicht mehr remove im return statement machen, sondern du brauchst 3 Zeilen:
- Element entfernen und in einer lokalen Variable speichern
- Event feuern
- lokale Variable returnen

Danke für den Tipp! Ich habe es folgendermaßen gelöst und es funktioniert einwandfrei:

Java:
public T removeElement() {
        
        T t = list.remove(list.size() - 1);
        fireIntervalRemoved(this, list.size(), list.size());
        return t;
    }

P.S.: Der Name removeElement() kann bestehen bleiben, da alle Elemente gelöscht werden. Ich entschuldige mich, falls ich es so rüber gebracht haben sollte, dass nur ein Element gelöscht werden soll.
 
Zurück