# jTable befüllen mit dynamischem Inhalt



## Davis99712 (27. Jul 2011)

Hallo liebe Community,
ich bin ein Java Neuling, arbeite mit NetBeans (7.0) und habe mir eine FrameForm mit einer jTable geklickt. Folgenden Code nutze ich, um die Datenbankverbindung zur PostgreSQL Datenbank (connector ist eingebunden) zu öffnen und Daten abzufragen - diese werden dann in der Kommandozeile ausgegeben:


```
System.out.println("Checking if Driver is registered with DriverManager.");
  
  try {
    Class.forName("org.postgresql.Driver");
  } catch (ClassNotFoundException cnfe) {
    System.out.println("Couldn't find the driver!");
    System.out.println("Let's print a stack trace, and exit.");
    cnfe.printStackTrace();
    System.exit(1);
  }
  
  System.out.println("Registered the driver ok, so let's make a connection.");
  
  Connection c = null;
  
  try {
    // The second and third arguments are the username and password,
    // respectively. They should be whatever is necessary to connect
    // to the database.
    c = DriverManager.getConnection("jdbc:postgresql://192.168.1.4/testdatabase",
                                    "testuser", "testpassword");
  } catch (SQLException se) {
    System.out.println("Couldn't connect: print out a stack trace and exit.");
    se.printStackTrace();
    System.exit(1);
  }
  
  if (c != null)
    System.out.println("Hooray! We connected to the database!");
  else
    System.out.println("We should never get here.");
 
  
  
  
  try
    {
      Statement statement = c.createStatement ();
 
      ResultSet resultSet = statement.executeQuery ("select * from aufgaben");
 
      ResultSetMetaData resultSetMetaData = resultSet.getMetaData ();
 
      System.out.println ("\n\nshow data from table: 'aufgaben'\n");
 
      String format = "%35s   %-6s   %10s   %s\n  %s\n  %s\n  %s\n";
 
      
      
            
       
       
      System.out.printf (format + "\n",
                         resultSetMetaData.getColumnLabel (1),
                         resultSetMetaData.getColumnLabel (2),
                         resultSetMetaData.getColumnLabel (3),
                         resultSetMetaData.getColumnLabel (4),
                         resultSetMetaData.getColumnLabel (5),
                         resultSetMetaData.getColumnLabel (6),
                         resultSetMetaData.getColumnLabel (7));
 
     
      
      while (resultSet.next ())
      {
        System.out.printf (format,
                           resultSet.getString (1),
                           resultSet.getString (2),
                           resultSet.getString (3),
                           resultSet.getString (4),
                           resultSet.getString (5),
                           resultSet.getString (6),
                           resultSet.getString (7));
      }
 
      resultSet.close ();
      statement.close ();
    }
    catch (SQLException e)
    {
      e.printStackTrace ();
      System.exit (1);
    }
```


Verbindung - OK
Daten abrufen - OK
Daten in Kommandozeile ausgaben - OK
Wie sorge ich dafür, dass die jTable diese Inhalte zeigt?
Ich möchte später eine GUI haben und keine Kommandozeile mehr - kennt sich da jemand mit aus?


----------



## Camino (27. Jul 2011)

Alles kein Problem. Anwendung mit Swing erstellen. Dort eine JTable rein. Ein TableModel dran. Eine Datenklasse erstellen, dann für jeden Datensatz ein Objekt erstellen und dies in einer ArrayList sammeln. Diese ArrayList ins Model, welche die Tabelle aktualisiert. Daten einfügen, ändern oder löschen dann immer über das Model und die Tabelle passt sich dann an.


----------



## c_sidi90 (27. Jul 2011)

Ein ähnlicher Lösungsweg:

Frage vor dem Laden in den Table die Anzahl an Datensätzen ab und erstelle ein Object [][] Array, die Größe ist die Anzahl an gefilterten Datensätzen. Desweiteren erzeugst du ein String[]Array für die Spaltennamen, diese kannst du ja aus deiner SQL Abfrage filtern und übergeben, sofern die Spaltennamen immer gleich sind, kannst du es gleich als static deklarieren.

Nun füllst du innerhalb einer geschachtelten For-Schleife das Object Array, erzeugst ein DefaultTableModel welchem du beide Arrays übergibst und setzt table.setModel(deinErzeugtesModel).

Lg


----------



## Davis99712 (28. Jul 2011)

Danke erstmal für eure schnelle Hilfe.



> Anwendung mit Swing erstellen. Dort eine JTable rein.


Das ist kein Problem - hab ich gemacht




> Ein TableModel dran.


Wo finde ich das bei Netbeans 7.0?



> Eine Datenklasse erstellen, dann für jeden Datensatz ein Objekt erstellen und dies in einer ArrayList sammeln.


Hier stehe ich jetzt ganz auf dem Schlauch^^



Wie gesagt - ich bin seit knapp 73 Stunden mit Java zu gange und habe vorher mit VB.NET und Visual Studio gearbeitet - da lief 80% über GUI und 20% über Quelltext
Ich glaube mittlerweile mitbekommen zu haben, dass das bei Java eher andersrum läuft.
Könnt Ihr mir ein Codebeispiel bezogen auf meinen Code oben geben oder ein Tutorial, welches mir das erklärt, was ich wissen muss?


1000 Dank für eure Hilfe

MfG
Nadine


----------



## Camino (28. Jul 2011)

Zur JTable gibt es hier ein gutes Tutorial:
http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/4841-jtable-ubersicht-teil-1-teil-8-a.html

Du musst halt irgendwie deine Daten aus der Datenbank in die Tabelle bekommen. Und das funktioniert am besten über ein TableModel. Das kannst du beim Erstellen der Tabelle mit übergeben:

```
JTable tabelle = new JTable(tableModel)
```
 oder später zuweisen: 
	
	
	
	





```
tabelle.setModel(tableModel)
```
. Je nachdem, wie deine Daten aus der Datenbank strukturiert sind, musst du dir überlegen, wie dein TableModel und die Datenstruktur aufgebaut sind, in denen du die Daten speicherst.


----------



## c_sidi90 (28. Jul 2011)

Hab es zwar jetzt nicht getestet, aber das sollte dich auf die Idee bringen, dein Vorhaben umzusetzen. So könnte man es angehen.


```
//JPanel erzeugen und JTable einbetten.
	JTable table = new JTable();
	JPanel panel = new JPanel(table);
	Object[][] data = null;
	//Wenn die Spaltennamen immer gleich sind, kannst du diese schon vorher festlegen
	String [] columnNames = {"Col1", "Col2"};
	
	 Statement statement = conn.createStatement();
	 ResultSet result = statement.executeQuery(deineSQLAbfrage);
	 ResultSetMetaData rsMetaData = result.getMetaData();
	 rowCount = rsMetaData.getRowCount();
	 //DatenArray erzeugen mit maxIndex of max rowCount in SQLTable
	 data = new Object[rowCount][rowCount];

	 //Iterier durch die Spalten des Tables
	 for(int i=0; i<columns.length;i++){
		 
		 //Für jede spalte, gehe jede Zeile durch und speicher sie im Datenarray
		 for(int j=0; j<data.length;j++){
			 
			 data[i][j] = result.getString(j);
		 }
	 }
	
	 //Erzeuge ein Tablemodel und übergeben die beiden Arrays
	 TableModel model = new DefaultTableModel(data,columnNames);
	 table.setModel(model);
```


----------



## Davis99712 (28. Jul 2011)

Hi,
erstmal danke erneut für eure Hilfe.

Muss ich noch irgendwas importieren?
Habe jetzt den Codeschnipsel an meinen Code angepasst - habe aber Fehlermeldungen, die nicht gehen wollen 

Java Fehlermeldungen


Danke

LG
Nadine


----------



## Michael... (28. Jul 2011)

Davis99712 hat gesagt.:


> Muss ich noch irgendwas importieren?


Ja, die fehlenden Klassen ;-) Was ist das für eine IDE die Du benutzt?
Ausserdem scheinen der int rowCount und das Array columns nicht deklariert zu sein. Eventuell soll columns ja auch columnNames heißen.


----------



## Michael... (28. Jul 2011)

Hab gerade im ersten Post was von NetBeans gelesen. Benutz ich zwar nicht, aber da wird es wohl eine Funktion zum automatischen Importieren fehlender Klassen geben?!


----------



## c_sidi90 (29. Jul 2011)

Sorry, richtig ich habe die Variablennamen nicht immer richtig übernommen, hatte es ebend im Editor gecoded, da ist es mir nicht aufgefallen. Das sollte auch keine konkrete Lösung sein, sondern nur ein Ansatz wie man vorgeht. 

Du musst die fehlenden Swingklassen importieren, die rowCount Variable mit int deklarieren und columns in columnNames umschreiben.

lg


----------



## Davis99712 (29. Jul 2011)

Ich tippe mal, dass Ihr euch wahrscheinlich nach meinem letzten Post beömmelt habt vor lachen 
Sind glaub ich alles Basic-Anfängerfragen - aber selbst ist die Frau 
Ich lerne ja auch alles, was ich hier erfahre um beim nächsten mal schlauer zu sein 


Mein Code sieht jetzt so aus:


```
//JPanel erzeugen und JTable einbetten.
    int rowCount;
    JPanel panel = new JPanel(jTable1);
    Object[][] data = null;
    //Wenn die Spaltennamen immer gleich sind, kannst du diese schon vorher festlegen
    String [] columnNames = {"Col1", "Col2"};
    
     Statement statement = c.createStatement();
     ResultSet result = statement.executeQuery("select * from aufgaben");
     ResultSetMetaData rsMetaData = result.getMetaData();
     rowCount = rsMetaData.getRowCount();
     //DatenArray erzeugen mit maxIndex of max rowCount in SQLTable
     data = new Object[rowCount][rowCount];
 
     //Iterier durch die Spalten des Tables
     for(int i=0; i<columnNames.length;i++){
         
         //Für jede spalte, gehe jede Zeile durch und speicher sie im Datenarray
         for(int j=0; j<data.length;j++){
             
             data[i][j] = result.getString(j);
         }
     }
    
     //Erzeuge ein Tablemodel und übergeben die beiden Arrays
     TableModel model = new DefaultTableModel(data,columnNames);
     jTable1.setModel(model);
```


Ich erhalte jetzt noch 2 "Fehler":

1. Die Zeile 
	
	
	
	





```
JPanel panel = new JPanel(jTable1);
```
 markert er mir an.

2. den Begriff getRowCount bei 
	
	
	
	





```
rowCount = rsMetaData.getRowCount();
```
 will er auch nicht haben - getColumnCount kennt er - ist aber wahrscheinlich nicht das, was es sein soll (zumindest kenne ich den Unterschied zwischen row und column^^)


Die anderen Fehler habe ich bei NetBeans mit "FixImports" beheben können, rowCount als int deklariert und columns in columnNames abgeändert.

Hab ich wieder was vergessen?


Danke nochmals für eure Hilfe 

Ganz liebe Grüße
Nadine


----------



## Camino (30. Jul 2011)

Davis99712 hat gesagt.:


> Ich erhalte jetzt noch 2 "Fehler":
> 
> 1. Die Zeile
> 
> ...



Wird dir denn da nicht angezeigt, was falsch ist? Bei Eclipse gibt es meistens auch Infos, was für ein Fehler vorliegt, und dann meistens auch noch dazu direkte Möglichkeiten, wie sich diese Fehler beheben lassen.
Du musst dir vom JPanel mal die vorgegebenen Konstruktoren anschauen. Da gibt es wohl keinen, bei dem du eine Tabelle übergeben kannst. Eine Tabelle musst du anders zum Panel hinzufügen.


----------

