fcklunae Geschrieben 28. September 2009 Geschrieben 28. September 2009 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 Zitieren
Dragon8 Geschrieben 28. September 2009 Geschrieben 28. September 2009 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? Zitieren
fcklunae Geschrieben 28. September 2009 Autor Geschrieben 28. September 2009 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! Zitieren
Dragon8 Geschrieben 28. September 2009 Geschrieben 28. September 2009 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. Zitieren
flashpixx Geschrieben 28. September 2009 Geschrieben 28. September 2009 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) Zitieren
fcklunae Geschrieben 28. September 2009 Autor Geschrieben 28. September 2009 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. Zitieren
fcklunae Geschrieben 29. September 2009 Autor Geschrieben 29. September 2009 Wir bekommen es einfach nicht hin.. :-( Na ja.. weiter versuchen.. Zitieren
perdian Geschrieben 29. September 2009 Geschrieben 29. September 2009 Wir bekommen es einfach nicht hinDas ist eine wunderbare Fehlerbeschreibung, da kann dir sofort jeder hilfreich zur Seite springen. Zitieren
fcklunae Geschrieben 29. September 2009 Autor Geschrieben 29. September 2009 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.. :/ Zitieren
ksg9-sebastian Geschrieben 29. September 2009 Geschrieben 29. September 2009 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! Zitieren
fcklunae Geschrieben 30. September 2009 Autor Geschrieben 30. September 2009 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. Zitieren
perdian Geschrieben 30. September 2009 Geschrieben 30. September 2009 Ich sags trotzdem: Unser Lehrer IST schlecht. ;-) Und Zeit haben wir wirklich keine mehrSo 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. Zitieren
fcklunae Geschrieben 1. Oktober 2009 Autor Geschrieben 1. Oktober 2009 (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 1. Oktober 2009 von fcklunae Zitieren
perdian Geschrieben 2. Oktober 2009 Geschrieben 2. Oktober 2009 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 nichtBevor 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. Zitieren
fcklunae Geschrieben 2. Oktober 2009 Autor Geschrieben 2. Oktober 2009 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! 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 Zitieren
flashpixx Geschrieben 5. Oktober 2009 Geschrieben 5. Oktober 2009 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 Zitieren
fcklunae Geschrieben 5. Oktober 2009 Autor Geschrieben 5. Oktober 2009 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! Zitieren
perdian Geschrieben 6. Oktober 2009 Geschrieben 6. Oktober 2009 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. Zitieren
fcklunae Geschrieben 6. Oktober 2009 Autor Geschrieben 6. Oktober 2009 Also in anderen Foren musste ich bisher nicht fragen, bevor ich jemanden angeschrieben habe.. Aber okay, andere Foren, andere Sitten! Zitieren
perdian Geschrieben 7. Oktober 2009 Geschrieben 7. Oktober 2009 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. Zitieren
Empfohlene Beiträge
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.