Zum Inhalt springen

ArrayList-Fragen


Empfohlene Beiträge

Geschrieben

Hi!

Wir haben eine Object [][]. Diese wollen wir mit Daten aus einer Datenbank in einer Tabelle anzeigen.

Das funktioniert mit dem ersten Datensatz auch wunderbar, aber alle folgenden werden nicht angezeigt.

Als Lösungsvorschlag wurde uns mitgeteilt, eine ArrayList zu verwenden.

Aber leider haben wir keine Ahnung, wie genau das Ganze funktionieren soll.. Kann uns eventuell jemand helfen und vielleicht sogar einen Beispielcode geben? Wäre echt super und wir wären sehr dankbar!

Liebe Grüße

lunae

Geschrieben

Ich gehe mal davon aus dass ihr versucht eine JTable zu erzeugen um euch die Daten anzeigen zu lassen.

Bei dieser könntet ihr aber neben einer Array aus Objekten maximal noch Vektoren mit den Daten übergeben, ein Konstruktor mit einer ArrayList ist meines Wissens nach nicht verfügbar.

Aber ich denke mal auch die Methode mit Vektoren wird euch nicht viel helfen, wenn schon was beim befüllen des Arrays mit den Daten oder der Übergabe dieser an die JTable schief geht, wovon ich jetzt eher ausgehen würde.

Wie sieht denn die Quelltextstelle aus in der ihr das Array und die JTable erzeugt?

Geschrieben

Hallo!

Erstmal danke für die Antwort!

Wir haben eine JTable mit einem eigenen TableModel. Im TableModel fügen wir unsere Daten ein. Sind in der Hinsicht noch recht unbeholfen, deswegen könnte der Code leicht nach Spaghetti aussehen.. *g*

private String[] createRow() {

        String tmpAutor = "";

        String tmpTitel = "";

        String tmpQuelle = "";

        String tmpSchlagworte = "";

        String tmpErscheinungsjahr = "";

        String werte = "";

        String[] werteArray = null;

        String tmp = "";

        String[] idArtikel = "".split(", ");

/*

 * Liest die IDs aller Datensätze der Tabelle und speichert sie in einer array

 */

        ResultSet tmpRs;

        try {

            tmpRs = db.select("SELECT ID FROM artikel");

            while (tmpRs.next()) {

                tmp += tmpRs.getInt("ID") + ",";

            }

            idArtikel = tmp.split(",");

        } catch (SQLException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }


         for (int i = 0; i < 1; i++) {

            try {


                for (int j = 0; j < table.length; j++) {

                    sTmp = "";

                    sql = "SELECT Name FROM artikel_" + table[j] + " INNER JOIN " + table[j]

                            + " ON (" + table[j] + ".ID=artikel_" + table[j] + "." + table[j]

                            + "_ID) WHERE artikel_" + table[j] + ".artikel_ID=" + idArtikel[i];

                    rs = db.select(sql);


                    while (rs.next()) {

                        if (rs.getRow() != 1)

                            sTmp += ", ";

                        sTmp += rs.getString("Name");

                    }


                    if (table[j].equals("autor"))

                        tmpAutor = sTmp;

                    else if (table[j].equals("schlagwort"))

                        tmpSchlagworte = sTmp;


                }


                for (int j = 0; j < coulums.length; j++) {


                    sql = "SELECT " + coulums[j] + " FROM artikel WHERE ID=" + idArtikel[i];


                    rs = db.select(sql);

                    while (rs.next()){

                        if (coulums[j].equals("Titel")) {

                            tmpTitel = rs.getString(coulums[j]);

                        } else if (coulums[j].equals("Quelle")) {

                            tmpQuelle = rs.getString(coulums[j]);

                        } else if (coulums[j].equals("Erscheinungsjahr")) {

                            tmpErscheinungsjahr = rs.getString(coulums[j]);

                        }

                    }

                }


            } catch (SQLException e1) {

                // TODO Auto-generated catch block

                e1.printStackTrace();

            }


            werte = idArtikel[i] + ";:;" + tmpAutor + ";:;" + tmpTitel + ";:;" + tmpQuelle

                    + ";:;" + tmpSchlagworte + ";:;" + tmpErscheinungsjahr;

        }

         werteArray = werte.split(";:;");



        return werteArray;

    }


    // Eine Variable vom Typ Objec[] [], in der wir die Zeilen erstellen.

   private Object[][] data = { {createRow()[0], createRow()[1], createRow()[2], createRow()[3], createRow()[4], createRow()[5]}};

Danke schon mal fürs Bemühen!

Geschrieben

Ohne euch jetzt zu Nahe treten zu wollen, aber der Quelltext sieht doch schon recht konfus aus ;)

Ich werde da jetzt nicht groß versuchen große Verbesserungen einzubringen, aber ich würde euch trotzdem raten, euch mal das Tutorial von Sun zu den Collections durchzulesen und dazu vor allem den Java Doc Eintrag für die ArrayList die euch ja schonmal vorgeschlagen wurde.

Die würde euch denke ich mal vor allem bei der Speicherung der Daten aus den ResultSets Arbeit ersparen. Außerdem kann man über die toArray() - Methode der Listen dann wieder aus dem Inhalt der ArrayList ein Array bilden um die JTable zu befüllen.

Außerdem finde ich die die Wertezuweisung eures Arrays data etwas befremdlich. Ihr ruft die Methode createRow() in dem Zuge 5x auf, obwohl 1x reichen würde, wenn ihr euch den Rückgabewert zwischenspeichert. Aber ich gehe doch bestimmt erstmal richtig davon aus, dass das Array data später als Datengrundlage für die JTable dient, oder?

Dann wundert es mich ein wenig, warum soll die for-Schleife nur einmal durchlaufen? Jedenfalls bewirkt eure Anweisung 'i < 1' dass die Schleife nur einmal ausgeführt wird, ich denke mal daher kommt es auch, dass ihr nur die erste Reihe an Datensätzen bekommt.

Wenn ihr jedoch alle haben wollt, müsste neben der for-Schleife, auch die Zwischenspeicherung der Gesamtergebnisse eines Durchlaufes überarbeitet werden, wie allgemein die restliche Zwischenspeicherung in der Methode ebenfalls.

Allgemein solltet ihr vielleicht nochmal die komplette Methode überarbeiten. Ich verstehe jetzt vor allem die 3 SQL Abfragen nicht, aber wenn ich raten müsste, würde ich sagen, dass erste fragt euch alle IDs ab und darüber holt ihr euch in den restlichen 2 Abfragen die gesamten Daten.

Ich würde also nun annhand der IDs alle Daten abfragen, bei jedem Schleifendurchlauf die Daten in ein Array schreiben und alle Arrays aller Schleifendurchläufe in einer gemeinsamen ArrayList speichern. Diese kannst du dann am Ende der Methode als gesamtes als 2 dimensionales Array zurück geben um die JTable zu befüllen.

Geschrieben

Der Code ist wirklich sehr undurchsichtig. Man kann einen JTable auch direkt aus dem Resultset füllen, indem man, wie schon genannt, einfach das Resultset entsprechend über die Collections umwandelt. Ich würde Dir empfehlen einfach mal die Beispiele aus der offiziellen Doku durch zu arbeiten:

How to Use Tables (The Javaâ„¢ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Geschrieben

Danke für den Tipp!

Leider haben wir dazu nicht mehr genug Zeit.. :(

Aber ums in Zukunft besser zu können, ists auf jeden Fall wichtig.

Danke euch beiden jedenfalls nochmal!

@ Dragon8: Haben heute angefangen, die Methode zu ändern und setzen es morgen fort. Werd dann berichten, ob wirs hinbekommen haben. :)

Geschrieben

Wenn ich wüsste, wo der Fehler liegt, dann würde ich es auch mitteilen.. ;) *g*

Na ja, wir versuchens weiter.

Hey, ein Erfolg! Es werden nun zwei Zeilen angezeigt! *g* Aber es gibt vier Einträge.. :/

Geschrieben

Es kommt mir langsam vor wie ein Fluch..

Uls unsereins angefangen hat Java zu programmieren hieß es erstmal 1-3 Jahre Grundlagen pauken (Syntax, Packages, Objektorientierung, Design Patterns, Analyse & Design, UML u.s.w.).

Wir haben tausende von Mini-Anwendungen gebaut welche nur per Eingeaufforderung aufgebaut haben.

Irgendwann mal gings mit UI los - genauso: Grundlagen, Grundlagen, Grundlagen.

Und iiirgendwann kamen auch mal Datenbanken.

Mittlerweile hat sich das irgendwie geändert:

Zuerst baut man ne Anwendung mit Datenbankanbindung (möglichst noch Hibernate, damit es auch sicher nicht funktioniert), minimum Swing-GUI, eher aber JEE - z.B: JSF. Was natürlich nicht fehlen darf ist Spring, die Wunderwaffe schlechthin. Weil das aber noch nicht reicht werden noch diverseste Frameworks reingebaut welche man mal gehört hat...Ajax ist auch immer dabei - super.

Und dann kommt die große Verwunderung: Es tut nicht - oh Wunder.

Leider kann niemand den Fehler finden weil der Code aussieht (und meist auch so entstanden ist) als hätte man alles nur wahrlos zusammekopiert, leider aber keine Ahnung vom Programmieren.

Meine Lehrer und Ausbildungsverantwortlichen hätten mir damals den Kopf abgerissen wenn ich ne Anwendung vorgelegt hätte mit einer Klasse welche 2000 Lines of Code hat, darin verbaut auch noch GUI, Model, Controller und selbstverständlich noch Datenbankanbindung.

Kurzum: Lern erstmal die Grundlagen.

Und bitte kein "Aber unser Lehrer ist so schlecht und wir haben keine Zeit". Das ist die wohl blödeste Ausrede überhaupt...

Bring erstmal Struktur in die Anwendung. Lager die Datenbank-Logik aus.

Bau entsprechende Objekte und befülle die aus der Datenbank.

Und nein, ein 2dimensionales Objekt-Array ist NICHT ziel der Objektorientierung.

Und dann ließ dir viele Tutorials zur JTabel und nem eigenen TabelModel durch.

Und dann kopier noch viel Code irgendwoher, frag noch 200x warum dein Programm nicht geht und DANN stellst du irgendwann fest dass du Grundlagen lernen solltest!

Geschrieben

Ich sags trotzdem: Unser Lehrer IST schlecht. ;-)

Und Zeit haben wir wirklich keine mehr (Freitag ist Abgabe). ;-)

Was ja nicht heißt, dass ich mich in meiner Freizeit nicht mit den Grundlagen beschäftigen kann - nur für den jetzigen Schulblock bringts leider nichts mehr.

Geschrieben
Ich sags trotzdem: Unser Lehrer IST schlecht. ;-)

Und Zeit haben wir wirklich keine mehr

So what?

Deinem Lehrer kann es letzten Endes auch egal sein, ob du die Dinge nun wirklich kannst oder dir irgendwo zusammenekla^wzusammengesucht hast. Er hat seine Aufgabe erfüllt, aber du wirst irgendwann auf die Nase fliegen weil du die Inhalte nicht wirklich verstanden hast.

Geschrieben (bearbeitet)

Die Tabelle können wir mittlerweile übrigens endlich ganz darstellen.. ;-)

Unsere beiden letzten zu lösenden Probleme sind folgende:

:old

Wenn wir über eine delete-Methode einen Eintrag aus der Datenbank löschen, so soll sich die Tabelle natürlich neu darstellen.

Das Darstellen an sich ist zwar kein Problem, aber wenn ich dann wieder einen Eintrag auswählen und anschließend löschen oder bearbeiten will, so wird die Selektion nicht erkannt.. :(

Weiß jemand einen Rat? :)

Vielleicht sollte ich dazu erwähnen, dass wir eine Methode "deselect" geschrieben hat, die mitteilt, dass die vorherige Selektion aufgehoben werden soll.

Des Weiteren haben wir eine Methode, die "fireTableDataChanged" aufruft. Anschließend erstellen wir die Daten aus der Datenbank per "createRow" neu in der Tabelle. Das Fenster, in dem die Tabelle dargestellt wird, öffnet sich anschließend wieder und wird auch ohne den gelöschten Datensatz dargestellt.

Das andere Problem ist, dass ich zwar eine .jar erstellen (der mysqlconnector wird in der lib mitgeliefert!) und auch ausführen kann, aber wenn ich dann von meiner Startoberfläche ein Fenster öffnen will, dass mit Datenbankzugriffen arbeitet, funktioniert es leider nicht (und das, obwohl bei mir ja lokal alles drauf ist!)..

Vielleicht hat ja jemand dort auch einen Tipp für uns..? Wäre euch sehr verbunden! :)

Bearbeitet von fcklunae
Geschrieben
Das andere Problem ist, dass ich zwar eine .jar erstellen (der mysqlconnector wird in der lib mitgeliefert!) und auch ausführen kann, aber wenn ich dann von meiner Startoberfläche ein Fenster öffnen will, dass mit Datenbankzugriffen arbeitet, funktioniert es leider nicht
Bevor du hier noch weiterpostest: Lerne bitte zunächst einmal dein(e) Problem(e) vernünftig und aussagekräftig zu beschreiben.

Geht nicht ist keine aussagekräftige Fehlerbeschreibung. Wenn du Hilfe haben möchtest musst du uns schon die notwendigen Infos dazu liefern. Ich lege dir daher dich zunächst hier einzulesen.

Zu deinem Problem: Die Glaskugel sagt mir, dass unter Umständen das JAR zwar auf der Platt, nicht aber im Classpath sein könnte.

Geschrieben

Hi!

Das Problem konnte heute behoben werden! :-)

Wir haben eine manifest-Datei geschrieben, die den Class-Path des Connectors und die Startklasse mitgibt. :-)

Anschließend wollte sich die .jar gar nicht mehr öffnen lassen, bis wir den Connector schließlich noch an die richtige Stelle gelegt haben. *g*

Jetzt funktionierts! :D

Nur die Tabelle lässt sich noch nicht richtig aktualisieren. Ich versuch, das Problem ordentlich zu beschreiben (wenn Code benötigt wird, bitte mitteilen! - aber ich warn vor, er funktioniert, sieht halt aber noch bescheiden aus.. :-( ).. (Ui, hier wird man bei bösen Worten ausgesternt. *g*)

Wir erzeugen uns ein JTable, welches ein eigenes TableModel bekommt. In der Klasse des TableModels haben wir eine Methode createRow(), die alle aktuellen Einträge aus der Datenbank ausliest und in der Tabelle darstellt.

Wenn wir das Programm nun verwenden und einen Datensatz löschen, so wird dieser physisch aus der Datenbank entfernt und soll natürlich nicht mehr dargestellt werden.

Ich hab das bisher so gelöst, dass das Fenster mit den "alten" Tabellendaten sich schließt, die Tabelle über "fireTableDataChanged" und der Methode "createRow()" aktualisiert wird und das Fenster mit den "neuen" Tabellendaten sich wieder öffnet. So weit so gut, das Gelöschte wird auch nicht mehr angezeigt.

Wenn ich dann jedoch eine Reihe markiere und diese bearbeiten oder löschen möchte, so erkennt die Tabelle meine Selektion nicht mehr und die gewünschten Aktionen sind somit nicht ausführbar. :-(

Wenn ich einen Datensatz bearbeite, wird das in der Datenbank gespeichert, aber in der Tabelle (obwohl ich den selben Weg wie beim Löschen gehe) nicht dargestellt! :upps

Ich hoffe, die Beschreibung war besser.. :beagolisc

Geschrieben

Es bringt gar nichts privat jemand per PM anzuschreiben. Wenn Du Fragen hast, gehören sie in den passenden Thread und damit bezwecken, dass Du schneller Hilfe bekommst, ist auch eine Utopie. Unterlasse private PMs, wenn Sie Dir nicht ausdrücklich erlaubt wurden

Du solltest Google verwenden und Dir das notwendige Wissen aneigenen

AbstractTableModel (Java 2 Platform SE v1.4.2)

Swing - Re: fireTableDataChanged doesn't change my JTable

Findet man, wenn man nach "firetabledatachanged" sucht

Geschrieben

Was glaubst du, wie viel Zeit ich schon mit Google totgeschlagen habe? ;)

Jetzt wird wahrscheinlich sowas kommen wie "scheinbar nicht genug" - stimmt aber nicht.

Die beiden Seiten hab ich auch schon gefunden, haben mir jedoch auch nicht weiter geholfen. Aber okay, dann schau ich mir das eben nochmal an und versuchs weiter..

Dass man hier erst PMs nach ausdrücklicher Erlaubnis schreiben darf, war mir nicht bewusst. Sorry vielmals und danke trotzdem für die Links!

Geschrieben
Was glaubst du, wie viel Zeit ich schon mit Google totgeschlagen habe?
Verbrachte Zeit bei Google ist weder ein Kriterium für besonders gute recherche noch bedeutet es eine Ausrede für "helft mir jetzt trotzdem". Oder anders ausgedrückt: Qualität != Quantität.

Dass man hier erst PMs nach ausdrücklicher Erlaubnis schreiben darf, war mir nicht bewusst.
Das ganze hat eher etwas mit allgemeiner Höflichkeit zu tun.
Geschrieben
Also in anderen Foren musste ich bisher nicht fragen, bevor ich jemanden angeschrieben habe..
Na dann überleg dir einfach mal, wie ein Forum genutzt wird.

Es lesen den Beitrag sicherlich noch andere Leute ausser du als Fragensteller und jemanden, der auf deien Frage angeht. Diese Mitleser treten vielleicht nie öffentlich in Erscheinung aber ziehen sich trotzdem für sich Infos raus, wenn sie die Frage und eine entsprechende Antwort dazu lesen. Oder sie klingen sich erst zu einem viel späteren Zeitpunkt in die Diskussion ein.

Wenn du dann plötzlich von Foren- auf Privat-Modus wechselst nimmst du diesen Leuten die Möglichkeit sich einzubringen.

Und last but not least: In einem Forum entscheidet immer noch jeder selbst wann er wo was hinpostet. Für eine private Beratung zahlst du woanders eine Menge Geld, da solltest du nicht annehmen, dass du die hier von Fachleuten gratis per E-Mail bekommst.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...