# Die gezogenen Daten werden nicht richtig ins JTableeingefügt



## MASTERmind (29. Apr 2005)

Moin!
Mittlerweile klappt das mit der JTable, allerdings erzeugt er zwei mal den gleichen Datensatz in der JTable, gibt aber in der Konsole zwei unterschiedliche richtige Datensätze aus.

Ich weiß jetzt nicht ob das ein JDBC Problem oder ein JTable Problem ist.


```
import java.sql.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Finanzanalyse extends JFrame implements ActionListener
{
 JLabel header;
 JLabel fehlerMeldung;
 JButton connect;
 static JTable table;
 static Vector vec;
 private Container con;

 String ausgabe;

 String[] titels;

 static DefaultTableModel model;

 public Finanzanalyse()
 {
  super("Daten aus der Datenbank saugen ...");
  con = getContentPane();

  titels = new String[]{"Umsaetze"};
  model = new DefaultTableModel(titels, 0);

  table = new JTable(model);

  vec = new Vector();

  connect = new JButton("saugen ");


  header = new JLabel("Daten Anzeige");
  fehlerMeldung = new JLabel("Fehler" );
  fehlerMeldung.setVisible(false);

  JPanel layoutPanel = new JPanel();
  layoutPanel.setLayout( new BoxLayout( layoutPanel, BoxLayout.Y_AXIS) );
  layoutPanel.add(header);
  layoutPanel.add(connect);

  layoutPanel.add( new JScrollPane( table ) );
  layoutPanel.add(fehlerMeldung);

  con.add(layoutPanel);
  connect.setActionCommand("saugen");
  connect.addActionListener(this);
 }

        public void actionPerformed(ActionEvent a)
        {

            if(a.getActionCommand().equals("saugen"))
            {
                try
                {
                  datenSaugenMethode();
                }
                catch (SQLException e)
                {
                    fehlerMeldung.setVisible(true);
                    System.out.println(e);
                }
                catch (ClassNotFoundException e)
                {
                    throw new RuntimeException(e);
                }
            }
        }

 public void datenSaugenMethode()throws SQLException, ClassNotFoundException
 {
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  String url = "jdbc:odbc:PostgreSQL";
  Connection con = DriverManager.getConnection(url, "user", "passwd");

  PreparedStatement st = con.prepareStatement("Select umsatz from finanzdaten");

  ResultSet rs = st.executeQuery();

  int numCols = rs.getMetaData().getColumnCount();

  while(rs.next())
  {
   for(int j = 1; j <= numCols; j++)
   {
             ausgabe = (rs.getString(j) + "");
             System.out.println(ausgabe);

   }
   vec.addElement(ausgabe);
   model.addRow(vec);
  }
   //System.out.println(vec.toString());
   
   st.close();
   //rs.close();
   con.close();
 }

 public static void main(String args[]) throws SQLException, ClassNotFoundException
 {
  Finanzanalyse app = new Finanzanalyse();
  app.setDefaultCloseOperation(EXIT_ON_CLOSE);
  app.setSize(200,200);
  app.setVisible(true);
 }
}
```


----------



## molotov (29. Apr 2005)

Das model.addRow(...) müsste wohl mit in die for-Schleife, wobei das so wie Du es momentan machst (mit dem Vector als Instanzvariable) nicht funktionieren würde...

Du könntest was in der Art versuchen:


```
Object[] arr = new Object[] { ausgabe };
model.addRow(arr);
```

Das ganze halt, wie gesagt, innerhalb der Schleife

[edit] vergesst das ganze, ist Schwachsinn - bin mit den Schleifen durcheinandergekommen    [/edit]


----------



## bellmann29 (29. Apr 2005)

Ja,

ich bins, siehe Thema "Swing, AWT, usw.".

Du hast ein Swing-Problem. Du hast die Daten.

Überlege was Du am TableModel aendern mußt!!

Sorry, wenn ich nerve.


----------



## MASTERmind (29. Apr 2005)

Das geht wunderbar.
Nur zum verständnis:

Du legst da einen neuen Array an, der die Werte der ausgabe aufnimmt oder???

Warum geht das nicht auch mit einem Vector.

Gedacht hab ich mir das so, wie du das geschrieben hast!

@bellmann:
ist kein table model glaub ich.
eher ein problem mit dem vector, der die daten aufnehmen sollte.

die table funzt perfetto, jetzt!


----------



## molotov (29. Apr 2005)

Ja, da wird ein Array angelegt, der die Werte aufnimmt.
Mit einem Vector müsste es auch gehen, die Probleme hattest Du vorher vermutlich nur, weil Du den Vector als Instanzvariable angelegt und zwischendrin nicht geleert hast, weshalb er zum Schluß mit allen Reihen gefüllt ist.
Das TableModel nimmt dann vermutlich immer die Werte vom Anfang - allerdings übernehme ich für meine Aussagen keine Gewähr, bin immer noch verwirrt   ???:L


----------



## bellmann29 (29. Apr 2005)

Schreib eine eigene TableModel-Klasse leite von DefaultTable-Model ab. Schreibe eine Mehtode z.B. "nimmVonVector"
übergib einen Vector.

In einer For Schleife Daten aus dem Vector nehmen und wie Molotov dem TableModel hinzufügen "super.addRow(array)". 

Objektorientierte Programmierung: Vorhandenes Ableiten und spezialisieren.

Wir können froh sein, das Sun das DefaultTableModel schon vorgibt, dann hat unsere neue Klasse nur eine Methode.

Somit doch ein Swing-Problem.

Nicht glauben, ausprobieren.

Bis dann.


----------



## MASTERmind (29. Apr 2005)

So funktioniert es auch mit dem Vector:


```
ausgabe = (rs.getString(j) + "");
             Vector vec = new Vector();
             vec.addElement(ausgabe);
             model.addRow(vec);
```

Wieso verwirrt???

thx, for help


----------



## molotov (29. Apr 2005)

Erstmal schön, daß es funktioniert   

Verwirrt bin ich, weil ich vorher mit den Schleifen durcheinandergekommen bin. Wenn Du das, wie ich - vermutlich fälschlicherweise - geschrieben habe in die for-Schleife reingepackt hast kann es sein, daß das ganze bei mehreren Spalten nicht mehr funktioniert.

Allerdings ist das ganze, wie bellmann29 schreibt, wirklich ein Swing-Problem, also sind wir hier eigentlich falsch.


----------



## MASTERmind (29. Apr 2005)

nun gut, dann schliess ich das mal und bitte um verzeihung!

probiere das mal mit einer zweiten spalte!


----------

