Daten in JTable aus DB schreiben ?

Status
Nicht offen für weitere Antworten.

maxwell

Mitglied
hallo zusammen,

hab wieder mal ein (für euch kleines) Problem und zwar schaffe ich es nicht,die ausgelesenen Daten (Datenbank) in eine Tabelle zu schreiben. Kurzer Überblick: Klasse DataManager (schreibt und) ließt die Daten aus der DB, wobei das Auslesen über getMessreihen() erfolgen soll. Die Daten sollen in der Tabell mrTable landen,für welche es ein TableModel gibt (Klasse TableModelMR). Die Tabelle befindet sich in der Klasse MainFrame. So,das sollte es gewesen sein, tausend Dank im Voraus !!!

Data Manager:
Code:
public class DataManager {
  private static DataManager instance;
o
o
o
  public HashMap getMessreihen() throws SQLException {

    HashMap messreihe = new HashMap();
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM messreihe;");
  
    while (rs.next()) {

      int messreihe_pk = rs.getInt("id");
      String name = rs.getString("name");
      String sensor = rs.getString("sensor");
      String messeinheit = rs.getString("messeinheit");
      String von = rs.getString("von");
      String bis = rs.getString("bis");
      String interval = rs.getString("interval");

      Integer i = new Integer(messreihe_pk);

      messreihe.put(i,new Messreihen (i, name, sensor, messeinheit, von, bis, interval));
    }
    rs.close();
    stmt.close();

    return messreihe;
Main Frame
Code:
public class MainFrame extends JFrame {
  DataManager dm = DataManager.getInstance();   

TableModelMR tmMR = new TableModelMR();

 JTable mrTable = new JTable(tmMR);
o
o
o
 public void initMrTable() {

    HashMap hm = null;
   
    try {
      hm = dm.getMessreihen();
    }
    catch (SQLException ex) {
      JOptionPane.showMessageDialog(this, "Fehler beim Laden der Messreihen!", "Laden", JOptionPane.ERROR_MESSAGE );
    }

    if (hm!=null) {
      mrTable.removeAll();
      Iterator i = hm.keySet().iterator();

      while (i.hasNext()) {
        Integer key = (Integer) i.next();
        mrTable.add(hm.get(key));   //??????????
       }
    }
Und das Table Model
Code:
public class TableModelMR extends AbstractTableModel{

Vector messreihen = new Vector();

     String headers[] = {"ID", "Name", "Sensor", "Messeinheit", "Von", "Bis", "Interval" };
     Class columnClasses[] = {Integer.class, String.class, String.class, String.class, Integer.class, Integer.class
                           ,Integer.class};


       public TableModelMR() { }

       public int getColumnCount() {
            return 7;
        }

        public int getRowCount() {
            return messreihen.size();
        }

        public String getColumnName(int col) {
            return headers [col];
        }

        public Object getValueAt(int row, int col) {
            Messreihen messreihe = (Messreihen)messreihen.get( row );

            switch( col ){
              case 0: return messreihe.getMessreihe_PK();
              case 1: return messreihe.getName();
              case 2: return  messreihe.getSensor();
              case 3: return  messreihe.getMesseinheit();
              case 4: return new Integer( messreihe.getVon() );
              case 5: return new Integer( messreihe.getBis() );
              case 6: return new Integer (messreihe.getInterval()) ;
              default: return null;
            }
        }
        public Class getColumnClass(int col) {
            return columnClasses[col];
        }

        public boolean isCellEditable(int int0, int int1) {
          return false;
        }

        public void setValueAt(Object object, int int1, int int2) {
        }

        public void addTableModelListener(TableModelListener tableModelListener) {
        }

        public void removeTableModelListener(TableModelListener tableModelListener) {
        }
}
 
soweit schaut das alles ganz ok aus... deinem tablemodel fehlen nur die Daten an sich!

das kannst du ja über den Konstrukutor machen, gib dem model ne liste mit, oder was immer du möchtest.
momentan hast du da nen "toten" vektor rumliegen, wo eigentlich die daten drin sein sollten, oder?

da steht ja nur .... = new Vector() ... der is natürlich leer......
 
oh,welch freude! hallo ronny!

die daten sollten eigentlich über die HashMap kommen (siehe initMrTable()) :bahnhof:
wobei ich grad sehe,dass er mir
Code:
 mrTable.add(hm.get(key));
".add(...) nicht auf meine mrTable anwenden lässt ???
 
das können sie ja auch....
mit "mitgeben" meinte ich über den Konstruktor vom TableModel:

dein konstruktor könnte z. B. so aussehen:

Code:
       public TableModelMR(Vector daten) { 
            messreihen = daten;
       }


(warum eigentlich nen vector? hmm.... )

das ganze geht natürlich auch mit ner hashmap....

soweit ich den code überrissen hab, kannst du statt nen vector auch ne hashmap nehmen...
ich glaub, da brauchst sogar, fast nix umbauen....

bevor du dann also das tablemodel instanzierst, kannst du dir die hashmap bauen lassen.. die gibst du dann einfach dem model mit....

dann sollts auch schon funzen!! 😀


achja, es gibt n ganz guten eintrag in den FAQs zum Thema JTable und alles, was dazu gehört... vielleicht findest du dort auch noch ein paar infos!
 
oh ja, das tutorial in den FAQ ist sogar RICHTIG gut!

wow, dass da jemand sich soviel zeit nimmt, das zu machen... @Beni: ein fettes RESPEKT!!! :applaus:
 
hmm...habs jetzt mal so probiert!hoff,dass ich dich richtig verstanden habe!?! aber ich bekomm in diese Tabelle nix rein :bahnhof: magst bitte noch mal über den code schauen,ob es so stimmt?
die FAQs hab ich eh schon durchgeackert,aber diesbezüglich konnt ich nichts finden...hab auch glaub ich schon ziemlich jeden post gelesen!
Code:
public class MainFrame extends JFrame {
  DataManager dm = DataManager.getInstance(); 
.
.
.
Vector daten = new Vector();
  TableModelMR tmMR = new TableModelMR(daten);
  JTable mrTable = new JTable(tmMR);
.
.
ublic void initMrTable() {

    HashMap hm = null;

    try {
      hm = dm.getMessreihen();
    }
    catch (SQLException ex) {
      JOptionPane.showMessageDialog(this, "Fehler beim Laden der Messreihen!", "Laden", JOptionPane.ERROR_MESSAGE );
    }

    if (hm!=null) {
      //mrTable.removeAll();
      Iterator i = hm.keySet().iterator();

      while (i.hasNext()) {
        Integer key = (Integer) i.next();
        daten.addElement(hm.get(key));
       }

kann es sein,da ich auch zeit- bzw. datumsangaben aus der db auslese,dass das schwierigkeiten macht?
 
hallo maxwell,

das problem ist folgendes:

Code:
Vector daten = new Vector();

damit erzeugst du einen leeren Vector der überhaupt nichts mit deinen daten zu tun hat....

vergiss einfach mal den vector und lass uns von deiner HashMap ausgehen, weil du das ja so schon implementiert hast...

also:

du erzeugst deine hashmap ganz normal wie immer:

Map meineMap = erzeugeMessdatenusw();

dann sagst du:

TableMode model = new MeinTableModel(meineMap);

das model gibst du dann der table mit, wie du es eh schon gemacht hast....


in deinem model baust jetzt den Konstruktor um, sodass er HashMaps nimmt:

Code:
...

private Map messDaten = null;

public MeinTableModel(Map meineMap) {
           messreihen = meineMap;
}


........

dein TableModel ist so gebaut, dass es theoretisch jetzt schon gehen müsste! da musst nich mal was umbauen!

achso, statt Map kannst auch einfach HashMap nehmen... ich habs nur so gelernt, dass man immer über die Schnittstellen die objekte anspricht... also nich verwirren lassen... (die macht der gewohnheit 🙂 )
 
Hi,

also,hab folgendes getan ???:L :
Code:
public class MainFrame extends JFrame {

 HashMap daten = new HashMap();
  TableModelMR tmMR = new TableModelMR(daten);
  JTable mrTable = new JTable(tmMR);

try {
      hm = dm.getMessreihen();
    }
    catch (SQLException ex) {
      JOptionPane.showMessageDialog(this, "Fehler beim Laden der Messreihen!", "Laden", JOptionPane.ERROR_MESSAGE );
    }

    if (hm!=null) {
      //mrTable.removeAll();
      Iterator i = hm.keySet().iterator();

      while (i.hasNext()) {
        Integer key = (Integer) i.next();
        daten.get(key);
       }

Jedoch nimmt er mir nach dem Umbau auf HashMaps das ".get(row)" in d. TableModel nicht mehr!
Code:
public Object getValueAt(int row, int col) {
            Messreihen messreihe = (Messreihen)messreihen.get( row );

hmm... :bahnhof:
 
uh oh, vorsicht!

du hast doch schon:

Code:
hm = dm.getMessreihen();

hm is doch deine hashmap! nich einfach new Hashmap machen! :wink:

du machst einfach noch NACH deiner Füllaktion (der try/catch block):

TableModelMR tmMR = new TableModelMR(hm);
JTable mrTable = new JTable(tmMR);

usw. (table dem frame/panel adden, jenachdem, wo du sie hin haben willst....)
 
mist, ganz vergessen:

klar, row geht nich, weil es ein "int" ist... (primitive)

der key einer hashmap ist immer ein objekt! mach einfach

Code:
Messreihen messreihe = (Messreihen)messreihen.get(new Integer(row));
 
hmm..also,wenn du das so gemeint hast
Code:
public class MainFrame extends JFrame {
.
.
 public void initMrTable() {

    HashMap hm = null;

    try {
      hm = dm.getMessreihen();
    }
    catch (SQLException ex) {
      JOptionPane.showMessageDialog(this, "Fehler beim Laden der Messreihen!", "Laden", JOptionPane.ERROR_MESSAGE );
    }

    if (hm!=null) {
    TableModelMR tmMR = new TableModelMR(hm);
    JTable mrTable = new JTable(tmMR);
    }
  }

Klasse TableModel:
Code:
public class TableModelMR extends AbstractTableModel{

     Vector messreihen = new Vector();

     public TableModelMR(Vector daten) {
         messreihen = daten;
        }
habich folgende Probleme: dass der Konstruktor für TableModel nicht passt und dass sämtliche methoden,welche mit der "mrTable" zusammenhängen, nicht mehr kennt, da dann die Tabelle in der Funktion erzeugt wird (können nicht mehr aufgelöst werden)!
???:L hast du noch ne idee???? 🙁
 
zu deinem model:

nicht mehr Vector verwenden, sondern HashMap....

wg. dem row problem hab ich weiter oben was dazu geschrieben...


zu deinem frame:

wenn du an anderer stelle die variablen brauchst, dann
mach daraus klassenvariablen, oder lokale variablen (wie z. b. auch deine HashMap)

Code:
public class MainFrame extends JFrame {
.
.
public void initMrTable() {

    HashMap hm = null;                       //lokale Variablen! nur innerhalb dieser Methode sichtbar
    TableModelMR tmMR = null;       
    JTable mrTable = null;

    try {
      hm = dm.getMessreihen();
    }
    catch (SQLException ex) {
      JOptionPane.showMessageDialog(this, "Fehler beim Laden der Messreihen!", "Laden", JOptionPane.ERROR_MESSAGE );
    }

    if (hm!=null) {
          tmMR = new TableModelMR(hm);
          mrTable = new JTable(tmMR);
    }
  }

im moment sind die in deinem if - block drin... klar, dass du da "ausserhalb" nich draufzugreifen kannst...



oda:

Code:
public class MainFrame extends JFrame {
.

    private TableModelMR tmMR = null;       //Klassenvariablen! innerhalb der kompletten Klasse MainFrame sichtbar
    private JTable mrTable = null;


.
public void initMrTable() {
....

Probier einfach noch mal ein bißchen was aus...
dir fehlt immer nur hier und da a bisserl was -> des wird scho!!!!

:wink:
 
Muss euch leider noch einmal mit meinem Problem quälen! Ich schaff es noch immer nicht,dass ich Daten,welche in meiner HashMap (hm = dm.getMessreihen()) stehen, in eine Tabelle bringe! Entweder ist die Tabelle leer (auch ohne Header) o. mein ganzer Frame ist finster. Könnte bitte noch mal jemand über den Code schauen???

Besten Dank im Voraus!
Code:
 public void initMrTable() {

    HashMap hm = null;
    //TableModelMR tmMR = null;
    //JTable mrTable = null;

    try {

       hm = dm.getMessreihen();
       //System.out.println(hm.toString());
    }
    catch (SQLException ex) {
      JOptionPane.showMessageDialog(this, "Fehler beim Laden der Messreihen!", "Laden", JOptionPane.ERROR_MESSAGE );
    }

    if (hm!=null) {

      Iterator i = hm.keySet().iterator();

      while (i.hasNext()) {

        Integer key = (Integer) i.next();

        tmMR = new TableModelMR(hm);
        mrTable.setModel(tmMR);

        System.out.println(hm.toString());
        System.out.println("Tabelle durchlaufen!");

Und mein Tabellen-Model:
Code:
HashMap messreihen = null;

     public TableModelMR(HashMap daten) {
         this.messreihen = daten;
        }

     String headers[] = {"ID", "Name", "Sensor", "Messeinheit", "Von", "Bis", "Interval" };
     Class columnClasses[] = {Integer.class, String.class, String.class, String.class, String.class, String.class
                           ,Integer.class};

       public int getColumnCount() {
            return 7;
        }

        public int getRowCount() {
            return messreihen.size();

        }

        public String getColumnName(int col) {
            return headers [col];
        }

        public Object getValueAt(int row, int col) {
            Messreihen messreihe = (Messreihen)messreihen.get(new Integer( row )); //.get(new Integer(row)

            switch( col ){
              case 0: return  messreihe.getMessreihe_PK();
              case 1: return  messreihe.getName();
              case 2: return  messreihe.getSensor();
              case 3: return  messreihe.getMesseinheit();
              case 4: return  messreihe.getVon() ;
              case 5: return  messreihe.getBis() ;
              case 6: return  messreihe.getInterval() ;
              default: return null;
            }
        }


        public Class getColumnClass(int col) {
            return columnClasses[col];
        }

        public boolean isCellEditable(int int0, int int1) {
          return false;
        }

        public void setValueAt(Object object, int int1, int int2) {
        }

        public void addTableModelListener(TableModelListener tableModelListener) {
        }

        public void removeTableModelListener(TableModelListener tableModelListener) {
        }
 
Hallo maxwell!

hmmm, wenn das der ganze code ist, dann könnt ich mir vorstellen
dass das adden der table an den frame fehlt (oder passiert das ausserhalb deiner init...() Methode?):

z. b. mit

Code:
getContentPane().add(jtable)


FALLS das nich den effekt hat wie es sein sollte, dann würde ich dir empfehlen, die jtable auf einen jpanel zu legen.
den jpanel legst du dann auf den frame. (das wäre besser, als sachen, wie z. b. tables, buttons, etc. direkt auf den frame zu legen....) da kannst du z. b. nochmal nen scrollpane drunterlegen, damit du scrollen kannst, etc.


den header kriegst du so zum laufen:

Code:
        JTableHeader header = new JTableHeader();
        header.setTable(jtable);
        jtable.getTableHeader().setVisible(true);


schreib nochmal, falls es immer noch probs gibt!
mann, ich kann nur hoffen, dass ich dich nicht jedesmal aufs neue verwirre....

bis denne!

ps: das tablemodel müsste passen!
 
hallo ronny,

erst mal danke,dass du dir die mühe machst. ja,das müsste alles in ordnung sein,denn wenn ich dem TableModel statisch eine Messreihe hinzufüge,dann erscheint sie in der tabelle!
:bahnhof:
ich will ja nicht gleich zu viel verlangen,aber bestünde die möglichkeit,dass ich dir das projekt mal schicke...aber wirklich nur,wenn du zeit und lust hast!
dank im voraus,
max
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben