Erstellen von JTables mit Daten aus SQL-Datenbank!

Horst2009

Grünschnabel
Hallo,

ich bin neuling bezüglich der Java und SQL anbindung.
Ich möchte eine Art Verwaltungsprogamm zu schreiben, hierfür muss ich eine Tabelle aus einer SQL Datenbank (Firebird) in Java, mittels eines JTabels dastellen.

Ich habe ein Quellcode geschrieben, bei dem mir eclipse auch keine Fehlermeldung gibt, jedoch öffnet sich beim ausführen der Class mit dem JTable keine Tabelle.

Wisst ihr vielleicht mehr

Ich habe hier mal den Quellcode der Class in der das JTable ausgeführt werden soll:
package Layoutstudenten;
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.swing.JFrame;
import javax.swing.JTable;





public class TB2 extends JFrame {
//Quelle:http://www.easy-coding.de/jtable-mit-daten-aus-der-datenbank-neu-zeichnen-t5280.html
			
	 JTable tab;
	 Statement stmt = null;
	 Connection con=null;
	 ResultSet rs =null;
	 private String user;
	 private String pw;
	 private String ur;
	 private String dataname;
	 private String prt;
	 

	 public TB2(String benutzer, String passwort, String url, String dbName, String port){                        //Konstruktor zum Erzeugen einer DB-Tabelleund Darstellen
	       
		 String user=benutzer;
		 String pw=passwort;
		 String ur=url;
		 String dataname=dbName;
		 String prt=port;
		 
		 
		 
		 	Object[][] daten= new Object[4][3];    // 2-dim. Feld für Tabellendaten
	        String[] spalten={"Projektname","Kunde","Budget"};    // Überschriften der Spalten
	        tab=new JTable(daten,spalten);                 // eine JTable konstruieren
	        tab.setPreferredScrollableViewportSize(new Dimension(300,150));      // Größe
	        add(tab,BorderLayout.CENTER);              // im Fensterzentrum einfügen
	        add(tab.getTableHeader(),BorderLayout.NORTH); // Spaltenüberschriften oben

	  addWindowListener(                        //Methode zum Reagieren auf Fensterereignisse hinzufügen
	    new WindowAdapter(){                        //Instanz der Klasse WindowAdapter (mit leerem Interface WindowListener)
	     public void windowClosing(WindowEvent e)        //überschreibt Reaktion auf Fensterschließen
	     {System.exit(0);}                                //mit Beenden des Programms
	    }
	  );
	 }
	 
	 public void  öffneDB()
	   {
	    	    
	        try {
	          Class.forName("org.firebirdsql.jdbc.FBDriver");                // Treiber laden
	        } catch (Exception e) {
	            System.out.println("Fehler beim Laden des JdbcOdbc Treibers");
	            return;
	          }
	        try {
	          con = DriverManager.getConnection(ur,user,pw);       // Verbindung zu Datenbank herstellen
	          stmt = con.createStatement();
	        } catch (Exception e) {
	            System.err.println("keine Verbindung zu "+ur);
	            return;
	          }
	   }

	 
	 public void frageProjekt()
	   {
	        try {
	          rs = stmt.executeQuery("select * from Personen;");         // Datenbankabfrage
	          int zeile=0;
	          while (rs.next()){                               //ResultSet abarbeiten: jeweils eine Zeile
	            tab.setValueAt(rs.getString(1),zeile,0);                //1. Attribut: String mit Projektname
	            tab.setValueAt(rs.getString(2),zeile,1);                //2. Attribut: String mit Kunde
	            tab.setValueAt(new Integer(rs.getInt(3)),zeile,2);      //3. Attribut: Int mit Budget als Objekt
	            zeile++;
	          }
	        }catch (Exception e) {
	            System.err.println("Fehler beim Bearbeiten der SQL-Anweisung"+
	                ": "+e.getMessage());
	         }
	        
	        try{
	            con.close();
	        }  catch (Exception e) {
	                 System.out.println("Fehler beim Schließen der DB");
	           }

	   }
	 


}

Ich weiß nicht wo mein Fehler ist, vielleicht könnt ihr mir helfen
Schonmal vielen Dank im Vorraus!
 
Ohne mir das jetzt genau angeschaut zu haben: ich würde erstmal dein Array als String definieren, dann erst das Array füllen, dann die Tabelle erstellen, die Tabelle auf ne ScrollPane packen, dann hast auch gleich den Header dabei, die ScrollPane auf dein Anzeige-Panel. Wenn du erst die Tabelle mit einem leeren Array erstellst und dann mit Daten füllst, musst du entsprechend dafür sorgen, dass es die Tabelle auch mitbekommt und sich aktualisiert.
Und ich würd auch statt mit Arrays mit Vektoren arbeiten oder werden deiner Tabelle keine Datensätze hinzugefügt? Dann hast du dein Daten-Array etwas dynamischer und läufst nicht Gefahr eine ArrayOutOfBoundException zu kassieren wenn sich mehr Datensätze als Zeilen in deinem Array in der Tabelle befinden.
 
Zuletzt bearbeitet:
Hi!!

Danke für deine schnelle Antwort!

Hmmm... mit Vektorven macht wirklich mehr sinn, hast recht, ich weiß nur nicht wie.

Und mit dem JScrollPane, nun, habe es ausprobiert einen leer auszuwerfen, das funktioniert jedoch auch nicht.-)

Was meinst du zu diesem Problem?
 
Hallo,

was meinst du mit es wird keine Tabelle geöffnet. Ist das Fenster denn da?

Ich hab das ganze jetzt mal ohne DB getestet und da wird eine Tabelle angezeigt.

Was die Vectoren angeht.
Du nutzt eigentlich schon Vectoren. Da du das Array der Tabelle gibst, legt die Tabelle intern ein DefaultTableModel an. Dieses befüllt einen Vector mit den Daten deines Arrays.

Wenn du jetzt Zeilen hinzufügen möchtest, geht das auch ganz einfach.
Code:
DefaultTableModel model = (DefaultTableModel)tab.getModel;
model.addRow(/*String-Array mit deinen Daten*/);

Ich würde das ganze aber etwas anders lösen. Ich würde eine Klasse Person erstellen, die die gleich Attribute hat, wie die Tabelle in der Datenbank. Wenn jetzt die Daten aus der Datenbank ausgelesen werden, würde ich für jede Zeile eine Person anlegen und mit Daten befüllen. Diese Person kann man dann in einer ArrayList speichern.
Für die Tabelle würde ich ein eigenes Model schreiben, dem ich diese Liste geben könnte. Mit einem TableCellRenderer würde ich die Daten dann entsprechend in der Tabelle darstellen.

Gruß

Sascha
 
hier mal nen kleines Demo-Programm

Code:
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;



public class JTableFill {

	static Vector<Vector<String>> rows;
	static Vector<String> column;
	static Vector<String> header;

	static JTable table;
	static JScrollPane sp;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrame x = new JFrame();
		x.setSize(800,600);
		createDataModel();
		x.add(initTable());
		x.setVisible(true);
	}
	
	
	private static JScrollPane initTable(){
		table = new JTable(rows, header);
		sp = new JScrollPane(table);
		return sp;
	}
	
	private static void createDataModel(){
		rows = new Vector<Vector<String>>();
		header = new Vector<String>();
		
		// Table-Header
		header.add("Spalte A");
		header.add("Spalte B");
		header.add("Spalte C");
		
		// Vektoren füllen
		column = new Vector<String>();
		column.add("1");
		column.add("2");
		column.add("3");
		rows.add(column);

		column = new Vector<String>();
		column.add("4");
		column.add("5");
		column.add("6");
		rows.add(column);

	}

}

ja da hat Sascha recht, vielleicht kannst das aber trotzdem mal gebrauchen irgendwann ;)
 
Zuletzt bearbeitet:
Hey wie geil!!

Vielen dank!!

Ich habe mein Problem auch bewältigt.
Habe in dem Aufruf der Class, "depose();" stehen gehabt.
Naja, das Fenster wurde geöffnet und gleich wieder geschlossen.


:rolleyes::rolleyes::rolleyes::rolleyes:

Ich habe da noch eine Frage das sieht ja schon mal gut aus, und gefällt mir besser als mein vorheriges, ist flexibler.
Wie bekommt ihr denn die Infos aus der DB in die Vektoren eingelesen?
Also die Verbindung steht und dann

Sorry, aber ich bin absoluter Anfänger und ihr denkt wohl das man mir alles "vorkauen" muss.:):):)

Danke für eure Hilfe
 
Hallo liebe Java-Profis

ich habe hier das selbe Problem wie der Kollege Horst2009.

Das Problem was ich habe ist, wie ich die Daten aus der SQL Datenbank in die von "normaler_Spinner" gezeigten Parameter kriege.

Was muss ich tun um mit Hilfe seiner Quellcodes eine Tabelle aus einer SQL Datenbank zu erstellen

Habt ihr da welche Ideen?


Vielen Dank im Vorraus

Flieger 27
 
im Prinzip genau so wie du sie schon in die Tabelle gepumpt hast

Code:
while (rs.next()){ 
         column = new Vector<String>();
         column.add(rs.getString(0));
         column.add(rs.getString(1));
         column.add(rs.getString(2));
         rows.add(column);
 }
 
Zuletzt bearbeitet:
Oh man ihr seid richtig net und gut.
Ich habe mich damit ein wenig beschäftigt und dabei habe ich sowas erstellt.
Leider funktioniert es immernoch nicht:(
Habt ihr vielleicht eine Ahnung was daran falsch ist?
Oder verbesserungsvorschläge?

Hier mein aktueller Quellcode.
Das Problem ist, der zeigt jetzt schon ein JFram an, jedoch ist dieses Leer und dann kommt ne Fehlermeldung.-):confused:


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Vector;


import javax.swing.*;
import javax.swing.table.DefaultTableModel;



public class layoutstudenten
{


static Vector<Vector<String>> rows;
static Vector<String> column;
static Vector<String> header;

static JTable table;
static JScrollPane sp;



public layoutstudenten(String benutzer, String passwort, String url,
String dbName, String port) {

table = new JTable(rows, header);
sp = new JScrollPane(table);

rows = new Vector<Vector<String>>();
header = new Vector<String>();

// Table-Header
header.add("Spalte A");
header.add("Spalte B");
header.add("Spalte C");
header.add("Spalte B");
header.add("Spalte C");


Connection con =null;
Statement stmt =null;
ResultSet rs =null;


try {

Class.forName("org.firebirdsql.jdbc.FBDriver");
//System.out.println("Treiber läuft");

}

catch(Exception e) {
System.out.println("Treiber läuft nicht! " + e);
}


//DIM SQLString as String ;


try {
// Verbindung herstellen
con = DriverManager.getConnection(url,benutzer,passwort);
//System.out.println("verbunden");
stmt = con.createStatement();
//System.out.println("1");



rs=stmt.executeQuery("SELECT * FROM Personen" );



int zeile=0;
while (rs.next()){
column = new Vector<String>();



column.add(rs.getString(0));
column.add(rs.getString(1));
column.add(rs.getString(2));




rows.add(column);
zeile++;

}

DefaultTableModel model = (DefaultTableModel)tab.getModel;
model.addRow();

con.close();
}


catch(Exception e)
{
System.out.println("Fehler beim Verbindungsaufbau " + e);
}

}


}
 
Zurück