tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
2285
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Horst2009 Horst2009 ist offline Rookie
    Registriert seit
    Feb 2009
    Beiträge
    6
    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;
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    
    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:[url]http://www.easy-coding.de/jtable-mit-daten-aus-der-datenbank-neu-zeichnen-t5280.html[/url]
                
         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!
     

  2. #2
    normaler_spinner normaler_spinner ist offline Mitglied Gold
    Registriert seit
    Jun 2005
    Beiträge
    117
    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.
    Geändert von normaler_spinner (19.02.09 um 13:26 Uhr)
     

  3. #3
    Horst2009 Horst2009 ist offline Rookie
    Registriert seit
    Feb 2009
    Beiträge
    6
    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?
     

  4. #4
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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 :
    1
    2
    
    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
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  5. #5
    normaler_spinner normaler_spinner ist offline Mitglied Gold
    Registriert seit
    Jun 2005
    Beiträge
    117
    hier mal nen kleines Demo-Programm

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
    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
    Geändert von normaler_spinner (19.02.09 um 15:20 Uhr)
     

  6. #6
    Horst2009 Horst2009 ist offline Rookie
    Registriert seit
    Feb 2009
    Beiträge
    6
    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.




    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
     

  7. #7
    flieger 27 flieger 27 ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    1
    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
     

  8. #8
    normaler_spinner normaler_spinner ist offline Mitglied Gold
    Registriert seit
    Jun 2005
    Beiträge
    117
    im Prinzip genau so wie du sie schon in die Tabelle gepumpt hast

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    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);
     }
    Geändert von normaler_spinner (19.02.09 um 22:28 Uhr)
     

  9. #9
    Horst2009 Horst2009 ist offline Rookie
    Registriert seit
    Feb 2009
    Beiträge
    6
    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.-)


    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);
    }

    }


    }
     

  10. #10
    normaler_spinner normaler_spinner ist offline Mitglied Gold
    Registriert seit
    Jun 2005
    Beiträge
    117
    ich vermute der Fehler liegt hier:

    Code :
    1
    2
    
    model.addRow(); // hier wird nichts übergeben
    model.addRow(rows);
     

  11. #11
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Na wenn eine Fehlermeldung kommt, solltest du die Fehlermeldung auch posten. Hellsehen ist leider keine meiner Stärken.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  12. #12
    Horst2009 Horst2009 ist offline Rookie
    Registriert seit
    Feb 2009
    Beiträge
    6
    Moin.
    Ich habe mir das Programm angeschaut und die Änderung von normaler_spinner vorgenommen.

    Ich weiß jedoch nicht ob es geklappt hat, da ich nun ne Fehlermeldung bei
    "

    DefaultTableModel model = (DefaultTableModel)tab.getModel;

    "

    habe. Der mag das " ..tab.getModel;" nicht, seht ihr woran das liegt?
    Die Fehlermeldung an der Stelle "tab cannot be resolved"
     

  13. #13
    ts230 ts230 ist offline Mitglied Brokat
    Registriert seit
    Jul 2007
    Ort
    CA
    Beiträge
    261
    Hast du die Variable "tab" überhaupt definiert?
    Wenn ja,wo?
    Probier mal die Deklaration von "tab" als public in deiner Klasse zu machen.
     

Ähnliche Themen

  1. Daten von MySql Datenbank in PostgreSql Datenbank
    Von Johannes7146 im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 06.11.09, 12:18
  2. Daten mit 9 Jtables
    Von kokoriko im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 23.10.07, 18:09
  3. JTables Problem
    Von xloouch im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 15.12.06, 15:25
  4. fragen zu jtables / tableCellRenderer - jbutton in jtables
    Von acky im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 19.05.05, 12:26
  5. JTables Focus behalten
    Von jorgeHX im Forum Java
    Antworten: 4
    Letzter Beitrag: 24.08.04, 13:30

Stichworte