herzchen Geschrieben 23. September 2005 Geschrieben 23. September 2005 <!-- -->Hi Leute, ich habe gestern nun über 4 Stunden damit verbracht, sämtliche englischsprachige Foren, Java.sun-Links, Code-Beispiele und Eigenideen zu durchforsten und auszuprobieren. Allgemein erstmal: Ich habe eine SQL Abfrage in eclipse mit JOINS, die ich in ein JTable darstellen möchte. Da ich mich nicht gut mit TableModels auskenne, habe ich mir die empfohlene JDBCAdapter-Klasse heruntergeladen, die die Daten automatisiert in das JTable packt. Gesehen habe ich schon, dass man das auch mit Vektor lösen kann und einen anderen Konstruktor als den Standard (new JTable()) nehmen kann. Das Auslesen von 22 Datensätzen dauert enorm (Datenbank ist MySQL in phpMyAdmin), also habe ich im SQL-Statement ein Limit von 10 Datensätzen festgelegt. Dauert zwar auch noch, aber nich mehr so lange. Jetzt fängt's an kompliziert zu werden. Ich möchte eine Blätterfunktion einbauen. Hierfür habe ich einen Button unterhalb des JTables angelegt und ein ImageIcon hinzugefügt (2 Pfeile), um es eindeutig zu machen. Normalerweise, so habe ich es theoretisch verstanden, geht man hin, und legt ein AbstractTableModel-Type an, an dem man die Methoden fireTableChanged() (o.ä.) aufrufen kann. Hinter dem Blättern-Button habe ich Code hinterlegt, der die nächsten 10 Datensätze aufrufen soll. Ich habe jetzt viel gelesen über eine Kopie der aktuellen Tabelle anlegen (weil zurückblättern soll man ja auch können ) und dann anzeigen mit repaint();. Würde jetzt zu viel werden alle Versuche hier zu posten....also habe ich eine 2. Tabelle angelegt, diese nochmal mit einer Datenbankabfrage gefüllt (könnt ihr mal schauen unten ob die funktionieren kann) und die erste Tabelle visible(false) gesetzt. Die 2. Tabelle wird mir auch angezeigt, zumindest die Spalten und die erste tritt aus dem Blickfeld hinaus. Aber Datensätze werden keine angezeigt. Syntaxtechnisch gibt er mir aber keine Fehler aus. Also, wofür ich dankbar wäre: - keine komplizierten Codebeispiele (es sei denn, es geht nicht anders), denn ich brauche einfach nur eine Grundlage, wie man das JTable am EINFACHSTEN updaten kann, ohne vorher den gesamten Programmcode wieder umändern zu müssen. Den Rest bastel ich selber.. - keine Links (davon hab ich wirklich genug, hab so viel gegoogelt!!) (achso hier noch ein Danke an den Herrn mit dem Tipp für die Screensize, hat funktioniert ) Hier mein Code: (Anm. Jaraz: Bitte Code Tags benutzen) Konstruktor aufrufen und SQL-Abfrage festlegen (ist immer gleich) public clsMain() { query = "SELECT t1.`Nr`, t1.`Titel`, t1.`Laenge`, t1.`Erscheinungsdatum`, t2.`Bezeichnung`, t3.`Status`, t4.`Nachname`, t5.`Format`" + "FROM `tblfilm` t1 INNER JOIN `tblkategorie` t2 ON t2.`ID` = t1.`Kategorie`, " + "`tblfilm` tmp1 INNER JOIN `tblstatus` t3 ON t3.`ID` = t1.`Status`, " + "`tblfilm` tmp2 INNER JOIN `tbldarsteller` t4 ON t4.`ID` = t1.`Darsteller`, " + "`tblfilm` tmp3 INNER JOIN `tblformat` t5 ON t5.`ID` = t1.`Format` " + "GROUP BY t1.`Nr` LIMIT 10"; } In der Main-Methode dann (u.a.): /* DataModel ruft Klasse JDBCAdapter auf * JDBCAdapter stellt Verbindung zur Datenbank her und * führt die Abfrage aus. Das Abfrageergebnis wird * anschliessend in das JTable "table" abgespeichert * und angezeigt. */ dataModel = new JDBCAdapter( "jdbc:mysql://localhost/dbdvd", "com.mysql.jdbc.Driver", "root", "12345678" ); dataModel.executeQuery(query); //Menübar erstellen popup = clsElements.PopMenDemo(); table = new JTable(dataModel); table.setComponentPopupMenu(popup); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); scrollp = new JScrollPane(table); //Panel erstellen mit dem Titel: Übersicht jpan = clsElements.Create_Panel("Uebersicht"); jpan.setBorder(BorderFactory.createEmptyBorder(35,10,10,10)); jpan.add(scrollp); //Button zum Vorwärtsblättern erstellen und Icon hierfür hinzufügen //Icon wird in oberste Hierarchie des packages angelegt jbuttforw = clsElements.Create_Button("", 50,20,720,225); ImageIcon icon = new ImageIcon( "forw.gif" ); jbuttforw.setIcon(icon); jbuttforw.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { int icount = table.getRowCount(); String nquery = "SELECT t1.`Nr`, t1.`Titel`, t1.`Laenge`, t1.`Erscheinungsdatum`, t2.`Bezeichnung`, t3.`Status`, t4.`Nachname`, t5.`Format`" + "FROM `tblfilm` t1 INNER JOIN `tblkategorie` t2 ON t2.`ID` = t1.`Kategorie`, " + "`tblfilm` tmp1 INNER JOIN `tblstatus` t3 ON t3.`ID` = t1.`Status`, " + "`tblfilm` tmp2 INNER JOIN `tbldarsteller` t4 ON t4.`ID` = t1.`Darsteller`, " + "`tblfilm` tmp3 INNER JOIN `tblformat` t5 ON t5.`ID` = t1.`Format` " + "WHERE t1.`Nr` > "+icount+ " GROUP BY t1.`Nr` LIMIT 10"; dm = new JDBCAdapter( "jdbc:mysql://localhost/dbdvd", "com.mysql.jdbc.Driver", "root", "12345678" ); dm.executeQuery(nquery); tableUPD = new JTable(dm); scr = new JScrollPane(tableUPD); jpan.add(scr); table.setVisible(false); tableUPD.setVisible(true); jf.getContentPane().add(tableUPD); jf.repaint(); } }); jf.getContentPane().add(jbuttforw); //Panel dem aktuellen Frame hinzufügen, alles sichtbar machen jf.getContentPane().add(jpan); jf.setVisible(true); Was ist verkehrt? Ist die 2. SQL-Abfrage mit dem >10 richtig oder, weil t1 die tblfilm-Tabelle ist. Aber tblfilm nimmt er nicht an. Und Datensätze zeigt er in dem 2. Table auch nicht an, nur die Spaltennamen. Für jeden Tipp dankbar! Herzi Zitieren
BlinderOpa Geschrieben 8. April 2008 Geschrieben 8. April 2008 schon table.firetabledatachange() nach der Änderung probiert? 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.