Tabelle aktuallisieren

julian.veh

Bekanntes Mitglied
Hi,
wie einige, bei meiner nun 3. Frage, bestimmt schon wissen, arbeite ich an einem Hardwareverwaltungssystem ^^.
Bis jetzt werden Produkte einwandfrei hinzugefügt, zu der JTable hinzugefügt usw., allerdings habe ich ein Problem beim löschen, was auch klappt, allerdings war es erst so, dass man das Programm neu starten musste um die gelöschten Produkte nicht mehr in der Tabelle zu sehen. Habe mir gedacht ich lösche einfach den ganzen Inhalt der Tabelle und lese ihn neu aus.

Java:
private void loeschen(String typ, String hersteller, String modell, String baujahr, String seriennummer, String lieferant, String preis) {
        Loeschen loeschen = new Loeschen();
        loeschen.loeschen(typ, hersteller, modell, baujahr, seriennummer, lieferant, preis);
        int a = this.model.getColumnCount();
        while(a > 0) {
            this.model.removeRow(a);
            a = a-1;
        }
        auslesen();
    }

Bekomme aber folgende Fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 7 >= 4
at java.util.Vector.removeElementAt(Vector.java:554)
at javax.swing.table.DefaultTableModel.removeRow(DefaultTableModel.java:463)
at HardwareVerwaltungsSystem.loeschen(HardwareVerwaltungsSystem.java:373)
at HardwareVerwaltungsSystem.access$900(HardwareVerwaltungsSystem.java:15)
at HardwareVerwaltungsSystem$6.actionPerformed(HardwareVerwaltungsSystem.java:323)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6504)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6269)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4860)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Wind.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
BUILD SUCCESSFUL (total time: 22 seconds)


Die Methode auslesen() rufe ich ja beim Start des Programms immer auf, daran kann es ja also nicht liegen. Falls aber doch ^^:

Java:
private void auslesen() {
        Auslesen auslesen = new Auslesen();
        ArrayList<Produkt> produkte = auslesen.auslesen();
        System.out.println(produkte);
        
        for (Produkt p : produkte) {
            int size = model.getColumnCount();
            String typ = p.getTyp();
            String hersteller = p.getHersteller();
            String modell = p.getModell();
            String baujahr = p.getBaujahr();
            String seriennummer = p.getSeriennummer();
            String lieferant = p.getLieferant();
            String preis = p.getPreis();

            Vector newDatas = createDataVector(typ, hersteller, modell, baujahr, seriennummer, lieferant, preis, size);
            model.addRow(newDatas);
        }
    }

Danke schonmal, falls mir jemand weiterhelfen kann 😉

lG
 
Woher kommen denn deine Daten? Aus einer Datenbank?
Normalerweise hat man für die JTable ein TableModel, in dem man die Daten ändert (hinzufügen, löschen, ändern) und das dann den Inhalt der Tabelle aktualisiert. Dazu hat das TableModel Methoden, die mit fire... anfangen.
 
Ja die Daten kommen aus einer Datenbank 🙂.

Ich habe einfach das DefaultTableModel importiert.

Java:
private final DefaultTableModel model;

Java:
private static Vector createDataVector(String typ, String hersteller, String modell, String baujahr, String seriennummer, String lieferant, String preis, int size) {
        Vector vector = new Vector(size);
        String inhalt = "";
        for (int i = 0; i < size; i++) {
            if (i == 0) {
                inhalt = typ;
            }
            if (i == 1) {
                inhalt = hersteller;
            }
            if (i == 2) {
                inhalt = modell;
            }
            if (i == 3) {
                inhalt = baujahr;
            }
            if (i == 4) {
                inhalt = seriennummer;
            }
            if (i == 5) {
                inhalt = lieferant;
            }
            if (i == 6) {
                inhalt = preis;
            }
            vector.add(inhalt);
        }

        return vector;
    }

Java:
 private void auslesen() {
        Auslesen auslesen = new Auslesen();
        ArrayList<Produkt> produkte = auslesen.auslesen();
        System.out.println(produkte);
        
        for (Produkt p : produkte) {
            int size = model.getColumnCount();
            String typ = p.getTyp();
            String hersteller = p.getHersteller();
            String modell = p.getModell();
            String baujahr = p.getBaujahr();
            String seriennummer = p.getSeriennummer();
            String lieferant = p.getLieferant();
            String preis = p.getPreis();

            Vector newDatas = createDataVector(typ, hersteller, modell, baujahr, seriennummer, lieferant, preis, size);
            model.addRow(newDatas);
        }
    }

Java:
    private void loeschen(String typ, String hersteller, String modell, String baujahr, String seriennummer, String lieferant, String preis) {
        Loeschen loeschen = new Loeschen();
        loeschen.loeschen(typ, hersteller, modell, baujahr, seriennummer, lieferant, preis);
        int a = this.model.getColumnCount();
        while(a > 0) {
            this.model.removeRow(a);
            a = a-1;
        }
        auslesen();
    }


Habe zu dem DefaultTableModel nur die Methode removeRow(int row) gefunden und dachte ich lösche alle und lese neu aus.
 
Aber mir
Code:
removeRow(int row)
kannst du doch auch einzelne Zeilen löschen.
 
Habe aber keine Idee wie ich herausfinden soll in welcher Zeile das gelöschte Objekt ist. Es können ja auch mehrere Objekte mit dem gleichen Namen sein. ||edit: geben, nicht sein ^^

Habe erst überlegt beim Erstellen des Objektes eine Zahl mit zu erstellen, die angibt, um das wie vielte Objekt es sich in der Datenbank handelt, aber wenn eins gelöscht wird würde sich das dann ja auch verschieben und wenn mein Programm so busy wird, dass es mehr als 2Milliarden Einträge gibt und ich als Datentyp int habe, auch wenn das unwahrscheinlich ist, würde es nicht mehr gehen.
 
Ich versteh nicht, was du gerade sagst. In einer relationalen Datenbank werden Einträge niemals doppelt gespeichert.
Und wenn absehbar ist, dass int nicht reichen könnte, dann nimmt man halt long, oder BigInteger, oder was weiß ich...
 
Wie löschst du denn im Moment? Normalerweise hast du doch eine eindeutige ID-Nummer aus der Datenbank für deine Datensätze (primary key).

Das mit den fire...-Methoden ist im AbstractTableModel.
 
Ich versteh nicht, was du gerade sagst. In einer relationalen Datenbank werden Einträge niemals doppelt gespeichert.
Und wenn absehbar ist, dass int nicht reichen könnte, dann nimmt man halt long, oder BigInteger, oder was weiß ich...

Ich weiß nicht genau was eine relationale Datenbank ist, jedenfalls verwende ich eine objektorientierte Datenbank db4o, weil ich ein objektorientiertes Projekt in der Schule mache. Natürlich gibt es nicht die selben Objekte, aber die gleichen, wenn ich 2 mal ein Objekt mit dem gleichen Attributen erstelle. Und ich lösche ja Objekte indem ich die Datenbank nach Objekten mit bestimmten Attributen durchsuche und diese entferne 😉.
 
Und ich lösche ja Objekte indem ich die Datenbank nach Objekten mit bestimmten Attributen durchsuche und diese entferne 😉.

Hmm, das kann aber auch mal schief gehen. Deshalb gibt es ja eindeutige IDs = Primärschlüssel, die nur einmal exisitieren dürfen. Damit hast du sichergestellt, dass z.B. genau der gewünschte Datensatz gelöscht wird.
 
Sorry, kenn mich mit db4o leider garnicht aus. Hab gerade nur auf der Wikipedia-Seite zu db4o ein Beispiel gesehen, wie da Daten hinzugefügt, geändert oder gelöscht werden.

Du musst doch irgendwie das Objekt bekommen (Zeile in Tabelle selektiert) und das dann löschen können.
 
Ok Trotzdem dann danke 😉

und meine Idee

Java:
private void loeschen(String typ, String hersteller, String modell, String baujahr, String seriennummer, String lieferant, String preis) {
        Loeschen loeschen = new Loeschen();
        loeschen.loeschen(typ, hersteller, modell, baujahr, seriennummer, lieferant, preis);
        int a = this.model.getColumnCount();
        while(a > 0) {
            this.model.removeRow(a);
            a = a-1;
        }
        auslesen();
    }

ist Humbug?

Ich makiere das mal nicht als erledigt, vllt kann mir ja noch jemand helfen 😉
 
Ich versuche das gerade nur zu verstehen. Man wählt Datensätze, die man ändern oder löschen möchte, anhand von Attributen wie z.B. Namen aus? Was aber wenn es doch mal mehrere gleiche Attribute gibt? Oder muss man sich dann selbst um einen Primärschlüssel kümmern? Oder alle Attribute mitgeben und den Datensatz dann dadurch identifizieren, so wie du es anscheinend gemacht hast.
 
Ich versuche das gerade nur zu verstehen. Man wählt Datensätze, die man ändern oder löschen möchte, anhand von Attributen wie z.B. Namen aus? Was aber wenn es doch mal mehrere gleiche Attribute gibt? Oder muss man sich dann selbst um einen Primärschlüssel kümmern? Oder alle Attribute mitgeben und den Datensatz dann dadurch identifizieren, so wie du es anscheinend gemacht hast.

Es wird immer nur ein Objekt gelöscht, ich denke das zu letzt hinzugefügte. Selbst wenn ich wüsste, wie man bestimmte Objekte löscht, habe ich auch keine Idee, wie ich in der Tabelle ein Objekt makieren könnte.
Ich finde es auch nicht sehr edel, alle Attribute einzugeben und dann das Objekt zu löschen, aber ich wollte erstmal das Projekt so weit fertig stellen, dass alles funktioniert, da ich noch fast 2 Monate Zeit habe, kann ich das ja immer noch verändern. So erschien es mir zunächst als einfachste Methode.

Ganz nebenbei. Gibt es eine Methode zum Schließen eines JDialog, die ich im Button hinzufügen und löschen ergänzen kann? So dass sich der Dialog direkt nach Hinzufügen eines Produkts schließt?

Gruß
 
http://community.versant.com/Documentation/Reference/db4o-8.0/java/tutorial/

Das ist nebenbei das Tutorial was mir empfohlen wurde und was ich verwendet habe.

2.5. Deleting objects


Objects are removed from the database using the #delete() method.

// deleteFirstPilotByName
ObjectSet result = db
.queryByExample(new Pilot("Michael Schumacher", 0));
Pilot found = (Pilot) result.next();
db.delete(found);
System.out.println("Deleted " + found);
retrieveAllPilots(db);


Let's delete the other one, too.

// deleteSecondPilotByName
ObjectSet result = db
.queryByExample(new Pilot("Rubens Barrichello", 0));
Pilot found = (Pilot) result.next();
db.delete(found);
System.out.println("Deleted " + found);
retrieveAllPilots(db);


Please check the deletion with the retrieval examples above.

As with updating objects, the object to be deleted has to be 'known' to db4o. It is not sufficient to provide a prototype object with the same field values.
[http://community.versant.com/Documentation/Reference/db4o-8.0/java/tutorial/]
 
Na ja, aber in dem Beispiel holt man sich aus der DB das Objekt anhand eines Attributs wie dem Namen und löscht das dann. Das kann es doch aber eigentlich nicht wirklich sein, oder?
 
Kann ich mir eigentlich nicht vorstellen, ausser man geht davon aus, dass es keine Objekte mit den exakt gleichen Attributen geben darf. Vielleicht weiss ja wer anderes mehr über db4o Bescheid...
 
Zur ArrayIndexOutOfBoundsException:
Der ColumnCount wird verwendet, um die Rows zu löschen. Der Index für
Code:
removeRow(index)
sollte >= 0 und < RowCount sein.
 
Jo Danke 🙂 habe getColumnCount() statt row benutzt und dachte außerdem, dass die rows von 1-rowCount nummeriert sind.
Danke 🙂

__Closed__
 

Neue Themen


Zurück
Oben