Objekte aus TableModel serialisieren und deserialisieren

xadoX

Aktives Mitglied
Hab eine JTable in die Daten geschrieben werden. Das Model der Tabelle heißt KategorieTableModel und hat u.a. folgenden Code:

Java:
public class KategorieTableModel implements TableModel, Serializable{
private ArrayList<Kategorie> kategorien = new ArrayList<Kategorie>();
private ArrayList listeners = new ArrayList();
private Kategorie lastAdded;

public void addKategorie(Kategorie insertingCat){
 ...
 fügt Kategorien einer Liste zu
 ...
 TableModelEvent tme = new TableModelEvent(this, index, index, TableModelEvent.ALL_COLUMNS,  TableModelEvent.INSERT );
 
        // Nun das Event verschicken
        for(int i = 0; i<listeners.size(); i++){
            ((TableModelListener)listeners.get(i)).tableChanged(tme);
        }
 
 public Kategorie getLastAddedCategory(){
        return lastAdded;
    }
}

Dann gibt es eine JComboBox deren Model wie folgt aussieht:

Java:
public class KategorieModelComboBox implements ComboBoxModel, TableModelListener, Serializable{
private ArrayList<Kategorie> kategorien = new ArrayList<Kategorie>();
private String selectedItem;
private KategorieTableModel model;
public void setModel(KategorieTableModel model){
        this.model = model;
        model.addTableModelListener(this);
    }
...
public void tableChanged(TableModelEvent e) {        
        addKategorie(model.getLastAddedCategory());
    }

Wichtig! Kategorieobjekte können nur einmal in die Tabelle gespeichert werden.
Das geschieht mit:

Java:
if(!model.contains(cat_leaf)){
                            model.addKategorie(cat_leaf);
                        }

Das KategorieTableModel wird bei jeder hinzugefügten Kategorie serialisiert und beim Programmstart wieder wie folgt geladen.

Java:
Serializer ser = new Serializer();
     KategorieTableModel catModel = ser.deSerializeModel();
     if(catModel!=null){
         jTableKategorieBaumSaved.setModel(catModel);
         ArrayList<Kategorie> cat_list = new ArrayList<Kategorie>();
         cat_list = catModel.getKategorieList();
         KategorieModelComboBox catModelCombo = new KategorieModelComboBox();
         for (int i=0; i<cat_list.size(); i++){
            catModelCombo.addKategorie(cat_list.get(i));
         }
         catModelCombo.setModel(catModel);
         jComboBoxeBayKat1.setModel(catModelCombo);
     } else {
        //falls zuvor noch nicht serialisiert wurde
         jTableKategorieBaumSaved.setModel(new KategorieTableModel());
         jComboBoxeBayKat1.setModel(new KategorieModelComboBox());
       }

Die Daten werden erfolgreich in die Tabelle und die Combobox geladen.
Wenn ich jetzt aber ein bereits in der Tabelle vorhandenes Kategorie-Objekt einfügen möchte, so klappt das. Und das ist nicht gewünscht.

Hab leider keine Idee warum
Java:
if(!model.contains(cat_leaf)){
                            model.addKategorie(cat_leaf);
                        }
die Objekte als nicht mehr gleich ansieht 🙁
 
Zuletzt bearbeitet:
Anstatt !model.contains(cat_leaf) könnte ich natürlich prüfen ob die KategorieID von dem Objekt schon mal in der Liste vorhanden ist. Kostet mich dann aber wieder an Performance, von daher wär es natülicher schöner, wenn die Objekte als gleich erkannt werden.
 
Nach dem Serialisieren und Deserialisieren hast du ein neues Objekt. Wenn du die equals und die hashCode-Methode in deiner Kategorie-Klasse nicht überschrieben und korrekt implementiert hast, dann ist das deserialisierte Objekt ungleich dem serialisierten.
 
Inwiefern muss ich die equals und hashCode-Methode überschreiben? Wie du schon vermutet hast, hab ich diese nämlich nicht in der Klasse Kategorie überschrieben.
 

Neue Themen


Zurück
Oben