# mysql- Ausgabe in JTable



## mbertholl (30. September 2003)

Hallo für eine Demo- Anwendung habe ich folgendes Beipiel aus Core Java 2 implemntiert:

//Zwei Ableitungen  von Tablemodell - geht bis zu 
----------------------
----------------------


```
abstract class ResultSetTableModel extends AbstractTableModel
{
   /**
      Konstruiert das Tabellenmodell.
      @param aResultSet Anzuzeigende Ergebnismenge
   */
   public ResultSetTableModel(ResultSet aResultSet)
   {
      rs = aResultSet;
      try
      {
         rsmd = rs.getMetaData();
      }
      catch(SQLException e)
      {
         e.printStackTrace();
      }
   }

   public String getColumnName(int c)
   {
      try
      {
         return rsmd.getColumnName(c + 1);
      }
      catch(SQLException e)
      {
         e.printStackTrace();
         return "";
      }
   }

   public int getColumnCount()
   {
      try
      {
         return rsmd.getColumnCount();
      }
      catch(SQLException e)
      {
         e.printStackTrace();
         return 0;
      }
   }

   private ResultSet rs;
   private ResultSetMetaData rsmd;
}

/**
   Dieses Klasse verwendet einen bildlauffähigen Cursor (ein
   JDBC 2-Feature), um Elemente der Ergebnismenge zu lokalisieren.
*/
class ScrollingResultSetTableModel extends ResultSetTableModel
{
   /**
      Konstruiert das Tabellenmodell.
      @param aResultSet Anzuzeigende Ergebnismenge
   */
   public ScrollingResultSetTableModel(ResultSet aResultSet)
   {
      super(aResultSet);
   }

   public Object getValueAt(int r, int c)
   {
      try
      {
         ResultSet rs = getResultSet();
         rs.absolute(r + 1);
         return rs.getObject(c + 1);
      }
      catch(SQLException e)
      {
         e.printStackTrace();
         return null;
      }
   }

}


abstract class ResultSetTableModel extends AbstractTableModel
{
   /**
      Konstruiert das Tabellenmodell.
      @param aResultSet Anzuzeigende Ergebnismenge
   */
   public ResultSetTableModel(ResultSet aResultSet)
   {
      rs = aResultSet;
      try
      {
         rsmd = rs.getMetaData();
      }
      catch(SQLException e)
      {
         e.printStackTrace();
      }
   }

   public String getColumnName(int c)
   {
      try
      {
         return rsmd.getColumnName(c + 1);
      }
      catch(SQLException e)
      {
         e.printStackTrace();
         return "";
      }
   }

   public int getColumnCount()
   {
      try
      {
         return rsmd.getColumnCount();
      }
      catch(SQLException e)
      {
         e.printStackTrace();
         return 0;
      }
   }

   /**
      Holt die Ergebnismenge, die dieses Modell offen legt.
      @return Die Ergebnismenge
   */
   protected ResultSet getResultSet()
   {
      return rs;
   }

   private ResultSet rs;
   private ResultSetMetaData rsmd;
}

/**
   Dieses Klasse verwendet einen bildlauffähigen Cursor (ein
   JDBC 2-Feature), um Elemente der Ergebnismenge zu lokalisieren.
*/
class ScrollingResultSetTableModel extends ResultSetTableModel
{
   /**
      Konstruiert das Tabellenmodell.
      @param aResultSet Anzuzeigende Ergebnismenge
   */
   public ScrollingResultSetTableModel(ResultSet aResultSet)
   {
      super(aResultSet);
   }

   public Object getValueAt(int r, int c)
   {
      try
      {
         ResultSet rs = getResultSet();
         rs.absolute(r + 1);
         return rs.getObject(c + 1);
      }
      catch(SQLException e)
      {
         e.printStackTrace();
         return null;
      }
   }

}

---------------------------------------------------
---------------------------------------------------

rs holt sich per executeQuery die Daten - klappt auch!
jetzt die Übergabe an Tablemodell bzw an JTable
----------------------
//Übergabe Resultset an model
model = new ScrollingResultSetTableModel(rs);

//Übergabe model an JTable
table = new JTable(model);
-----------------------
Normalerweise bin ich davon ausgegangen das das alles ist. Weil es nicht funktioniert, habe ich noch folgendes implementiert:
--------------------------
colcount = model.getColumnCount();
rowcounbt = 0;
while(rs.next())
{
   for(int i=0;i(istKleine)colcount;i++) //wegn Äger mit dem Editor
      table = (JTable)model.getValueAt(rowcount,i);
   rowcount++;
}

//Anfügen von Table an Scrollpane
scroll = new JScrollPane(table);
```
Das Problem:

JTable enthält nur die Metadaten. Die Datenzeilen selber werden nicht angezeigt.

Hat jemand eine Idee?

Danke im Vorraus

mbertholl


----------



## Thomas Darimont (11. Oktober 2003)

Servus!

Hier ein komplettes JTable / JDBC Beispiel ...

Viel Spaß!

Gruß Tom


----------



## Thomas Darimont (11. Oktober 2003)

Servus!

So schauts aus:


----------



## Thomas Darimont (11. Oktober 2003)

Servus!

An den OP!

Das hier funktioniert bei mir mit deinem TableModel ...


```
/*
 * JTable_JTestFrm.java
 *
 * Created on 11. Oktober 2003, 11:30
 */

/**
 *
 * @author  Administrator
 */
public class JTable_JTestFrm extends javax.swing.JFrame {
    
    private java.sql.Connection con = null;
    private java.sql.ResultSet rs = null;
    private java.sql.ResultSetMetaData rsmd = null;
    private java.sql.Statement stmt = null;
    
    private ScrollingResultSetTableModel srstm = null;
    private boolean connected = false;
    
    /** Creates new form JTable_JTestFrm */
    public JTable_JTestFrm() {
        initComponents();
    }
    
    private void initDB(){
        //Treiberklasse Laden
        try{
            Thread.currentThread().getContextClassLoader().loadClass("org.gjt.mm.mysql.Driver").newInstance();
        }catch(ClassNotFoundException cnfe){
            cnfe.printStackTrace();
        }catch(InstantiationException ie){
            ie.printStackTrace();
        }catch(IllegalAccessException iae){
            iae.printStackTrace();
        }
        
        //Verbindung zur Datenbank Aufbauen
        
        try{
            con = java.sql.DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql","Administrator","");
            connected = true;
            stmt = con.createStatement();
            
            rs = stmt.executeQuery("SELECT * FROM USER");
            rsmd = rs.getMetaData();
            
            srstm = new ScrollingResultSetTableModel(rs);
            
            this.jTable1.setModel(srstm);
            this.jTable1.updateUI();
            
        }catch(java.sql.SQLException sqle){
            sqle.printStackTrace();
        }
        
        
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jPanel1 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jPanel3 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();

        getContentPane().setLayout(new java.awt.GridBagLayout());

        setTitle("JTable TEST");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setLayout(new java.awt.GridBagLayout());

        jPanel1.setMinimumSize(new java.awt.Dimension(400, 300));
        jPanel1.setPreferredSize(new java.awt.Dimension(400, 300));
        jPanel2.setMinimumSize(new java.awt.Dimension(400, 200));
        jPanel2.setPreferredSize(new java.awt.Dimension(400, 200));
        jScrollPane1.setBackground(new java.awt.Color(255, 204, 51));
        jScrollPane1.setMinimumSize(new java.awt.Dimension(400, 195));
        jScrollPane1.setPreferredSize(new java.awt.Dimension(400, 195));
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jScrollPane1.setViewportView(jTable1);

        jPanel2.add(jScrollPane1);

        jPanel1.add(jPanel2, new java.awt.GridBagConstraints());

        jPanel3.setBackground(new java.awt.Color(102, 153, 255));
        jPanel3.setMinimumSize(new java.awt.Dimension(400, 100));
        jPanel3.setPreferredSize(new java.awt.Dimension(400, 100));
        jButton1.setText("Connect");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jPanel3.add(jButton1);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        jPanel1.add(jPanel3, gridBagConstraints);

        getContentPane().add(jPanel1, new java.awt.GridBagConstraints());

        pack();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // Add your handling code here:
        if (!connected){
            initDB();
        }else{
            new javax.swing.JOptionPane().showMessageDialog(this,"Die Datanbankverbindung ist bereits geöffnet!","Error",javax.swing.JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {
        if (con != null){
            try{
            con.close();
            }catch(java.sql.SQLException sqle){
                sqle.printStackTrace();
            }   
        }
        System.exit(0);
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        new JTable_JTestFrm().show();
    }
    
    
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration
    
}
```

hier "meine" beiden TableModel Klassen 


```
/*
 * ResultSetTableModel.java
 *
 * Created on 11. Oktober 2003, 11:16
 */

/**
 *
 * @author  Administrator
 */
import java.sql.*;

public abstract class ResultSetTableModel extends javax.swing.table.AbstractTableModel {
    
    /** Creates a new instance of ResultSetTableModel */
    public ResultSetTableModel(ResultSet aResultSet) {
        rs = aResultSet;
        try {
            rsmd = rs.getMetaData();
        }
        catch(SQLException e) {
            e.printStackTrace();
        }
    }
    
    public String getColumnName(int c) {
        try {
            return rsmd.getColumnName(c + 1);
        }
        catch(SQLException e) {
            e.printStackTrace();
            return "";
        }
    }
    
    public int getColumnCount() {
        try {
            return rsmd.getColumnCount();
        }
        catch(SQLException e) {
            e.printStackTrace();
            return 0;
        }
    }
    
    /** Getter for property rs.
     * @return Value of property rs.
     *
     */
    public java.sql.ResultSet getRs() {
        return rs;
    }
    
    /** Setter for property rs.
     * @param rs New value of property rs.
     *
     */
    public void setRs(java.sql.ResultSet rs) {
        this.rs = rs;
    }
    
    private ResultSet rs;
    private ResultSetMetaData rsmd;
}

/*
 * ScrollingResultSetTableModel.java
 *
 * Created on 11. Oktober 2003, 11:18
 */
import java.sql.*;
/**
 *
 * @author  Administrator
 */
public class ScrollingResultSetTableModel extends ResultSetTableModel {
    
    /** Creates a new instance of ScrollingResultSetTableModel */
    
    public ScrollingResultSetTableModel(ResultSet aResultSet) {
        super(aResultSet);
    }
    
    public Object getValueAt(int r, int c) {
        try {
            ResultSet rs = getRs();
            rs.absolute(r + 1);
            return rs.getObject(c + 1);
        }
        catch(SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    public int getRowCount(){
        ResultSet rs = this.getRs();
        if (rs!=null){
            try{
            rs.last();
            int cnt = rs.getRow();
            rs.beforeFirst();
            return cnt;
            }catch(SQLException sqle){
                sqle.printStackTrace();
            }
        }
        return -1;
    }
    
    
}
```


Gruß Tom


----------



## Thomas Darimont (11. Oktober 2003)

Servus!

... und so siehts aus ...

Gruß Tom


----------



## Tobander (20. Dezember 2003)

*JTable*

Hey,
habe folgendes Problem:
Ich habe Daten aus einer Datenbank ausgelesen und möchte
diese jetzt in einer Tabelle ausgeben.Das geht doch mit einer
JTable,oder?Aber wie übergebe ich das ResultSet an diese JTable?
Kann mir bitte jemand helfen.
mfg Toby
hier mein bisheriger Quellcode:
import java.sql.*;            
public class Testat9 {
    static String url;
    static String Driver;
    static String sql;
    static int nummer;
    static String autor,titel;
    static Connection con;
    static Statement stmt;
    static ResultSet result;
       public static void main(String[] args) throws Exception{
        System.out.println("\n\n\n\n\n");
        System.out.println("Datenbankzugriff mit JDBC");
        System.out.println("=========================\n\n");     
        url = "jdbcdbc:Bücher";             
        try {
            // JDBC over ODBC Treiber laden
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            con = DriverManager.getConnection(url,"admin","");
            System.out.println("Verbinden ...");
        }     
        catch (SQLException e){
            System.out.println("Fehler beim Verbindungsaufbau");
            System.exit(0);
        }
        catch (ClassNotFoundException e){
            System.out.println("JDBC over ODBC Treiber nicht gefunden!");
            System.exit(0);
        }
        System.out.println("Verbindungsaufbau erfolgreich\n");
           try {
            sql = "SELECT * FROM buch1 ORDER BY autor,titel ASC";
            stmt = con.createStatement();
            result = stmt.executeQuery(sql);        
            System.out.println("Autor\t\tTitel");
            System.out.println("----------------------");
            while (result.next()){            
                autor = result.getString("Autor");
                titel = result.getString("Titel");
                System.out.println(autor+"\t\t"+titel+"\t");
            }
            result.close();
            stmt.close();
            con.close();          
        }     
        catch (SQLException e){
            System.out.println("Fehler bei der Ausgabe");
            System.out.println(e);
        }
    }


----------



## batok (12. März 2006)

Hallo an alle,

habe mir das beispiel hier angeschaut und gemerkt das hier nur für die Ausgabe einer Tabelle möglich ist. Habe dies ebenfalls mal etwas anders implementiert und es funktioniert auch.
Wie kann ich aber nun, falls ich als option angeben kann das ich alle Tabellen einer Datenabank  augeben will, in einer JTable einfügen? 
Versuche es mit den Vectoren, doch ich komme nicht auf die richtige Zuweisung der Zeilen mit den Spalten. :-(

Hat einer vielleicht eine erlösende Idee? 

Gruß
batok


----------

