Zum Inhalt springen

JTable aktualisieren


herzchen

Empfohlene Beiträge

<!-- -->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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Jahre später...

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...