# Datenbank-Tabelle in SWING/AWT ausgeben



## schneffi (18. Jun 2009)

Hallo Leute!

Mein Problem ist folgendes: Ich habe eine Datenbank, logischerweise sind da Tabellen drin. Nun ist die Aufgabe, eine dieser Tabellen auszugeben in einem neuen Fenster, und zwar mit Swing oder AWT.

Ich verwende NetBeans.

Muss ich eine komplett neue main-funktion anlegen, wo das neue Fenster aufgerufen wird?

Ich hab auch versucht, in den vorhandenen Quellcode das Fenster manuell zu erstellen, aber dort komme ich dann nicht weiter, wie ich das Fenster mit der Tabelle bzw. den Datenbankdaten füllen könnte.

Ich muss also auf einen Button klicken und mit Klick soll sich das neue Fenster öffnen. Wie geh ichs an?

Mein aktueller Stand der Dinge:


```
private void DBAnzeigenActionPerformed (java.awt.event.ActionEvent evt)
    {
        zeigeTabelle();

    }

    public void zeigeTabelle()
    {
        JFrame frame = new JFrame();
        frame.setVisible(true);
    }
```

So, damit wird das neue Fenster aufgerufen. Wie krieg ich dort die Tabelle rein?

Danke für Eure Hilfe!


----------



## kowa (18. Jun 2009)

Hallo,

wenn du ein neues Fenster haben willst dann erstelle eine neue Klasse mit JFrame ohne main Methode, die du dann aus dem Hauptprogramm mit new MeineTabelle(); aufrufst.

Für die Daten aus der Datenbank kannst du dann ein JTable nehmen.


----------



## schneffi (19. Jun 2009)

Hi kowa, danke für deine Antwort.

Das hab ich jetzt selbst auch so hinbekommen, irgendwie hab ich ganz vergessen, dass ich hier gefragt habe ;-)

Jedenfalls öffnet das Fenster und die Tabelle ist auch drin. Nun steh ich vorm größten Problem: die Daten in die Tabelle zu kriegen.

Ich hab was von einem TableModel gelesen...und übrigens das Tutorial von Sun über Tabellen hab ich auch bestimmt schon 30x gelesen aber ich werd daraus nicht schlau.

Soweit ich weiss MUSS ich ein TableModel anlegen, okay das verstehe ich noch. Und was mach ich dann damit? Wie krieg ich die Daten in die Tabelle?

Ich hab jetzt für das TableModel auch eine neue Klasse angelegt, ohne main-Funktion.


----------



## kowa (19. Jun 2009)

Hier ist ein Beispiel.

Du brauchst kein TableModel. Einfach ein String Array (wie im Beispiel) mit den Überschriften erstellen, dann ein Zwei-dimensionales Object-Array mit den Daten pro Reihe. 

Also so die Überschriften:


```
String[] headers = {"title1", "title2", ...}
```

Und so die Daten:


```
Object[][] content = {{"content11", "content21"}, {"content12", "content22"}, {...}}
```

Das ganze dann einem JTable als Parameter übergeben, wie im Beispiel


----------



## schneffi (22. Jun 2009)

super, das hat funktioniert, danke 

hatte jetz noch eine Frage, die sich aber mehr oder weniger von seblst gelöst hat,...aber glaubt mir, es kommen sicherlihc weitere ;-)

so..jetzt:

neues Objekt meiner Tabelle anlegen:


```
MyTable tabelle = new idics_db_access_v1.MyTable ( rowData );
```

Hab ich in meinen Frame gemacht wo vorher dies stand:


```
for (int c = 0; c < ((Object[]) rowData.get ( 0 )).length; ++c)
        {
            model.addColumn("Column " +Integer.toString(c));
        }

        for (int r = 0; r < rowData.size (); ++r)
        {
            model.addRow ( (Object[]) rowData.get ( r ));
        }
        table.setModel ( model );
        jScrollPane1.getViewport ().add ( table);
```

Bekomme jetzt einen Haufen Fehler, bzw Nullpointer Exceptions.
Überhaupt hab ich gar keinen Plan was ich heir eigetnlich mache.


----------



## schneffi (22. Jun 2009)

die NullpointerExceptions sind jetzt irgendwie weg, dennoch bekomme ich einen Fehler wegen einer fehlenden Variablen, die aber vorher da war. Könntet ihr bitte mal drüber schaun? Es ist alles ein wenig verworren, aber ich denke mal es ist so wie immer, dass es irgendwo ein Mini-Fehler ist den ich net finde.

Hauptklasse wo alles abläuft:

```
private void VerbindenActionPerformed (java.awt.event.ActionEvent evt)                                          
    {                                              
        System.out.println("Verbinden");
        statusMessageLabel.setText ( "Verbinden...");
        verbinden();
    }
    public void verbinden()
        {
            try
            {
                Class.forName("org.postgresql.Driver" );
            }
            catch (ClassNotFoundException ex)
            {
                System.out.println(ex.getMessage());
                statusMessageLabel.setText ("Treiber nicht gefunden!");
            }

            try
            {
                conn = DriverManager.getConnection("...");

            }
            catch (Exception e)
            {
                System.out.println(e.getMessage ());
                statusMessageLabel.setText("Verbindung fehlgeschlagen!");
            }
}                                         

    private void TrennenActionPerformed (java.awt.event.ActionEvent evt)                                        
    {                                            
        trennen();
        System.out.println("Getrennt");
        statusMessageLabel.setText("Verbindung trennen...");
    }                                       


    public void trennen()
    {
        try
        {
            conn.close();
        }
        catch (Exception exs)
        {
            exs.printStackTrace();
            System.out.println("Verbindung kann nicht getrennt werden!");
        }
    }

    private void DBAnzeigenActionPerformed (java.awt.event.ActionEvent evt)                                           
    {                                               
     zeigeTabelle();
    }                                          

    public void zeigeTabelle()
    {
       LinkedList bla = new LinkedList();
       Object[] dbdata;

       try
       {
           Statement stmt = conn.createStatement           (ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
           ResultSet rs = stmt.executeQuery("SELECT * FROM st_user");
           ResultSetMetaData rsmd = rs.getMetaData();
           
                while (rs.next())
                {
//                  System.out.println ("Column Count" +rsmd.getColumnCount());
                    dbdata = new Object[rsmd.getColumnCount()+1];
                    for (int i = 1; i <= rsmd.getColumnCount(); i++)
                    {
                      dbdata [i-1] =   rs.getObject ( i );

                    }
                    bla.add ( dbdata);
//                    String name = rs.getString("bezeichnung");
//                    System.out.println("Name: " +name);
                }
           rs.close();
           stmt.close();
       }
       catch (Exception exce)
       {
           System.out.println(exce.toString());
       }
       MyTable table = new MyTable();
       showTableFrame tableframe = new showTableFrame(bla);
       tableframe.setVisible ( true);
       new showTableFrame(bla).setVisible(true);
    }
```

Hauptprogramm:


```
public class showTableFrame extends JFrame 
{
    private DefaultTableModel model = new DefaultTableModel();
    public showTableFrame(LinkedList rowData)      
    {   
        MyTable table = new MyTable(rowData);
        table.setModel ( model );
       jScrollPane1.getViewport ().add ( table);
       for (int c = 0; c < ((Object[]) rowData.get ( 0 )).length; ++c)
           {
               model.addColumn("Column " +Integer.toString(c));
           }

           for (int r = 0; r < rowData.size (); ++r)
           {
               model.addRow ( (Object[]) rowData.get ( r ));
            }
            table.setVisible(true);
//.....
```

In diese Klasse soll die Tabelle rein, daher hab ich sie schon reinkopiert. Allerdings findet er die Variable rowData nicht.


```
public class MyTable extends JTable

{
    private DefaultTableModel model = new DefaultTableModel();
    private JScrollPane jScrollPane1;

        public MyTable () //LinkedList rowData
        {
            MyTable table = new MyTable();
            table.setModel ( model );
            jScrollPane1.getViewport ().add ( table);
            for (int c = 0; c < ((Object[]) rowData.get ( 0 )).length; ++c)
            {
                model.addColumn("Column " +Integer.toString(c));
            }

            for (int r = 0; r < rowData.size (); ++r)
            {
                model.addRow ( (Object[]) rowData.get ( r ));
            }
            table.setModel ( model );
            jScrollPane1.getViewport ().add ( table);
            table.setVisible(true);
        }
}
```


----------



## schneffi (23. Jun 2009)

MyTable.java

```
/////////////////////
//DATENBANK-TABELLE//
/////////////////////

package idics_db_access_v1;


import javax.swing.table.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.*;
import java.sql.*;

public class MyTable extends JTable

{
   private DefaultTableModel model = new DefaultTableModel();
   private JTable table = new JTable(model);

    public MyTable(LinkedList rowData)
    {
        for (int c = 0; c < ((Object[]) rowData.get ( 0 )).length; ++c)
        {
            model.addColumn("Column " +Integer.toString(c));
        }

        for (int r = 0; r < rowData.size (); ++r)
        {
            model.addRow ( (Object[]) rowData.get ( r ));
        }
        table.setModel ( model );


    }

}
```

GUI für die Tabelle (showTableFrame.java)

```
package idics_db_access_v1;

import javax.swing.*;
import javax.swing.table.*;
import java.util.*;

public class showTableFrame extends JFrame
{
        //private int rows = 3;
        //private int cols = 5;
        //private Object[] rowData = new Object[cols];
        private DefaultTableModel model = new DefaultTableModel();
        private JTable table = new JTable(model);

    public showTableFrame(LinkedList rowData)
    {
        initComponents();
        for (int c = 0; c < ((Object[]) rowData.get ( 0 )).length; ++c)
        {
            model.addColumn("Column " +Integer.toString(c));
        }

        for (int r = 0; r < rowData.size (); ++r)
        {
            model.addRow ( (Object[]) rowData.get ( r ));
        }
        table.setModel ( model );
        jScrollPane1.getViewport ().add ( table);
        
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setName("Form"); // NOI18N

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        jTable1.setAutoCreateColumnsFromModel(false);
        jTable1.setModel(model);
        jTable1.setName("jTable1"); // NOI18N
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 539, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 210, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        pack();
    }// </editor-fold>

    public static void main(String args[])
    {
       /* JFrame tableframe = new showTableFrame();
        tableframe.setVisible ( true);*/
    }
    // Variables declaration - do not modify
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration
}
```


Haupt-GUI

```
package idics_db_access_v1;

import java.sql.*;
import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import javax.swing.*;

public class Idics_db_access_v1View extends FrameView {

    public Idics_db_access_v1View(SingleFrameApplication app) {
        super(app);

        initComponents();

        // status bar initialization - message timeout, idle icon and busy animation, etc
        ResourceMap resourceMap = getResourceMap();
        int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
        messageTimer = new Timer(messageTimeout, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                statusMessageLabel.setText("");
            }
        });
        messageTimer.setRepeats(false);
        int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
        for (int i = 0; i < busyIcons.length; i++) {
            busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
        }
        busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
                statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
            }
        });
        idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
        statusAnimationLabel.setIcon(idleIcon);
        progressBar.setVisible(false);

        // connecting action tasks to status bar via TaskMonitor
        TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
        taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                String propertyName = evt.getPropertyName();
                if ("started".equals(propertyName)) {
                    if (!busyIconTimer.isRunning()) {
                        statusAnimationLabel.setIcon(busyIcons[0]);
                        busyIconIndex = 0;
                        busyIconTimer.start();
                    }
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(true);
                } else if ("done".equals(propertyName)) {
                    busyIconTimer.stop();
                    statusAnimationLabel.setIcon(idleIcon);
                    progressBar.setVisible(false);
                    progressBar.setValue(0);
                } else if ("message".equals(propertyName)) {
                    String text = (String)(evt.getNewValue());
                    statusMessageLabel.setText((text == null) ? "" : text);
                    messageTimer.restart();
                } else if ("progress".equals(propertyName)) {
                    int value = (Integer)(evt.getNewValue());
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(false);
                    progressBar.setValue(value);
                }
            }
        });
    }

    @Action
    public void showAboutBox() {
        if (aboutBox == null) {
            JFrame mainFrame = Idics_db_access_v1App.getApplication().getMainFrame();
            aboutBox = new Idics_db_access_v1AboutBox(mainFrame);
            aboutBox.setLocationRelativeTo(mainFrame);
        }
        Idics_db_access_v1App.getApplication().show(aboutBox);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        mainPanel = new javax.swing.JPanel();
        Verbinden = new javax.swing.JButton();
        Trennen = new javax.swing.JButton();
        DBAnzeigen = new javax.swing.JButton();
        menuBar = new javax.swing.JMenuBar();
        javax.swing.JMenu fileMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
        javax.swing.JMenu helpMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
        statusPanel = new javax.swing.JPanel();
        javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
        statusMessageLabel = new javax.swing.JLabel();
        statusAnimationLabel = new javax.swing.JLabel();
        progressBar = new javax.swing.JProgressBar();

        mainPanel.setName("mainPanel"); // NOI18N

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(idics_db_access_v1.Idics_db_access_v1App.class).getContext().getResourceMap(Idics_db_access_v1View.class);
        Verbinden.setText(resourceMap.getString("Verbinden.text")); // NOI18N
        Verbinden.setName("Verbinden"); // NOI18N
        Verbinden.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                VerbindenActionPerformed(evt);
            }
        });

        Trennen.setText(resourceMap.getString("Trennen.text")); // NOI18N
        Trennen.setName("Trennen"); // NOI18N
        Trennen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                TrennenActionPerformed(evt);
            }
        });

        DBAnzeigen.setText(resourceMap.getString("DBAnzeigen.text")); // NOI18N
        DBAnzeigen.setName("DBAnzeigen"); // NOI18N
        DBAnzeigen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                DBAnzeigenActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addComponent(Verbinden, javax.swing.GroupLayout.PREFERRED_SIZE, 172, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(41, 41, 41)
                        .addComponent(Trennen, javax.swing.GroupLayout.DEFAULT_SIZE, 167, Short.MAX_VALUE)
                        .addContainerGap())
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
                        .addComponent(DBAnzeigen)
                        .addGap(130, 130, 130))))
        );
        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
                .addContainerGap(184, Short.MAX_VALUE)
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(Verbinden)
                    .addComponent(Trennen))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(DBAnzeigen)
                .addContainerGap())
        );

        menuBar.setName("menuBar"); // NOI18N

        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
        fileMenu.setName("fileMenu"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(idics_db_access_v1.Idics_db_access_v1App.class).getContext().getActionMap(Idics_db_access_v1View.class, this);
        exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
        exitMenuItem.setName("exitMenuItem"); // NOI18N
        fileMenu.add(exitMenuItem);

        menuBar.add(fileMenu);

        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
        helpMenu.setName("helpMenu"); // NOI18N

        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
        aboutMenuItem.setName("aboutMenuItem"); // NOI18N
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        statusPanel.setName("statusPanel"); // NOI18N

        statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N

        statusMessageLabel.setName("statusMessageLabel"); // NOI18N

        statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

        progressBar.setName("progressBar"); // NOI18N

        javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
        statusPanel.setLayout(statusPanelLayout);
        statusPanelLayout.setHorizontalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(statusMessageLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 380, Short.MAX_VALUE)
                .addComponent(statusAnimationLabel)
                .addContainerGap())
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, statusPanelLayout.createSequentialGroup()
                .addContainerGap(223, Short.MAX_VALUE)
                .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 167, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        statusPanelLayout.setVerticalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(statusMessageLabel)
                    .addComponent(statusAnimationLabel)
                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(3, 3, 3))
        );

        setComponent(mainPanel);
        setMenuBar(menuBar);
        setStatusBar(statusPanel);
    }// </editor-fold>

    Connection conn;
    private void VerbindenActionPerformed (java.awt.event.ActionEvent evt)
    {
        System.out.println("Verbinden");
        statusMessageLabel.setText ( "Verbinden...");
        verbinden();
    }

    public void verbinden()
    {
        try
        {
            Class.forName("org.postgresql.Driver" );
        }
        catch (ClassNotFoundException ex)
        {
            System.out.println("Treiber nicht gefunden!");
            statusMessageLabel.setText ("Treiber nicht gefunden!");
        }

         try
        {
            conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/idics","","");

        }
        catch (Exception e)
        {
            System.out.println(e.getMessage ());
            statusMessageLabel.setText("Verbindung fehlgeschlagen!");
        }
}

    private void TrennenActionPerformed (java.awt.event.ActionEvent evt)
    {
        trennen();
        System.out.println("Getrennt");
        statusMessageLabel.setText("Verbindung trennen...");
    }


    public void trennen()
    {
        try
        {
            conn.close();
        }
        catch (Exception exs)
        {
            exs.printStackTrace();
            System.out.println("Verbindung kann nicht getrennt werden!");
        }
    }

    private void DBAnzeigenActionPerformed (java.awt.event.ActionEvent evt)
    {
     zeigeTabelle();
    }

    public void zeigeTabelle()
    {
       LinkedList bla = new LinkedList();
       Object[] dbdata;

       try
       {
           Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
           ResultSet rs = stmt.executeQuery("SELECT * FROM st_user");
           ResultSetMetaData rsmd = rs.getMetaData();

                while (rs.next())
                {
                    System.out.println ("Column Count" +rsmd.getColumnCount());
                    dbdata = new Object[rsmd.getColumnCount()];
                    for (int i = 1; i <= rsmd.getColumnCount(); i++)
                    {
                      dbdata [i-1] =   rs.getObject ( i );
                    }
                    bla.add ( dbdata);
                    String name = rs.getString("bezeichnung");
                    System.out.println("Name: " +name);
                }
           rs.close();
           stmt.close();
       }
       catch (Exception exce)
       {
           System.out.println(exce.toString());
       }
       JFrame tableframe = new showTableFrame(bla);
        tableframe.setVisible ( true);
    //new showTableFrame(bla).setVisible(true);
    }
    // Variables declaration - do not modify
    private javax.swing.JButton DBAnzeigen;
    private javax.swing.JButton Trennen;
    private javax.swing.JButton Verbinden;
    private javax.swing.JPanel mainPanel;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JProgressBar progressBar;
    private javax.swing.JLabel statusAnimationLabel;
    private javax.swing.JLabel statusMessageLabel;
    private javax.swing.JPanel statusPanel;
    // End of variables declaration

    private final Timer messageTimer;
    private final Timer busyIconTimer;
    private final Icon idleIcon;
    private final Icon[] busyIcons = new Icon[15];
    private int busyIconIndex = 0;

    private JDialog aboutBox;
}
```

mein Anliegen: die Tabellenstruktur soll in die Klasse MyTable.java

Frage: Wie verknüpfe ich die Abfragen mit Tabellenstruktur und GUI? Ist der Aufbau so okay oder sollte ich lieber nochmal umstrukturieren?

Es wäre echt nett wenn ihr mir ein paar Tipps geben könntet, ich bin eigentlich absoluter Java-Neuling und muss mich möglichst schnell in die Thematik reinarbeiten, leider ist der Java-Guru in meiner Firma zur Zeit nicht da und irgendwie muss ich mich da durchquälen


----------



## schneffi (25. Jun 2009)

so, ich bin jetzt schon ein ganzes Stückchen weiter gekommen (und mittlerweile weiss ich auch, was ich da gemacht habe ;-))

Ich hoffe es liest noch jemand mit?

Jedenfalls kommen jetz NullPointerExceptions und so richtig weiß ich jetzt wirklich nicht weiter.

Ich habe mein Programm in mehrere Klassen aufgeteilt:
ein Hauptprogramm (Aufruf des GUI)
eine GUI-Klasse (GUI-Befehle und Aufruf von Methoden durch ActionPerformed etc.)
eine Datenbank-Klasse (Die DB auslesen)
eine Tabellenklasse (Verbindung zur DB herstellen und die Tabellenstruktur festlegen)


```
////////////////////
//TABELLENKLASSE////
//TABELLENSTRUKTUR//
////////////////////

package idics_db_viewv3;

//Imports

public class MyTable extends JFrame
{
    MyDB meineDB = new MyDB();
    JFrame tableFrame = new JFrame();
    JPanel tablePanel = new JPanel();
    JScrollPane tableScrollPane = new JScrollPane();
    DefaultTableModel model = new DefaultTableModel();
    JTable MyTable = new JTable(model);
    LinkedList list = new LinkedList();
    Vector columnNames = new Vector();
    Vector data = new Vector();
    Object[] dbdata;
    
    public MyTable() 
    {   
        try
        {
        while (meineDB.rs.next ())
        {
            dbdata = new Object[MyDB.rsmd.getColumnCount()];
            for (int i = 1; i <= MyDB.rsmd.getColumnCount(); i++)
            {
               dbdata [i-1] = MyDB.rs.getObject ( i );
            }
            list.add ( dbdata);
            String name = MyDB.rs.getString("bezeichnung");
            System.out.println("Name: " +name);
        }
           
        //Anzahl Spalten
           int columns = MyDB.rsmd.getColumnCount();
           System.out.println ("Anzahl Spalten: " +columns);
           
         //Spaltennamen
           for (int i = 1; i <= columns; i++)
           {
               columnNames.addElement ( MyDB.rsmd.getColumnName ( i));
           }
           
         //Daten
           while (MyDB.rs.next ())
           {
               Vector row = new Vector (columns);
               for (int i = 1; i <= columns; i++)
               {
                   row.addElement ( row);
               }
           }
            MyDB.rs.close();
            MyDB.stmt.close();
        }
        catch (SQLException sqle)
        {
            System.out.println(sqle);
        }
        
        //*******DAS NEUE FENSTER FÜR DIE TABELLE*******//
        JTable meineTabelle = new JTable(data, columnNames);
        JScrollPane meinScrollPane = new JScrollPane(meineTabelle);
        Container contentPane = getContentPane();
        contentPane.add ( meinScrollPane);
        JPanel meinPanel = new JPanel ();
        contentPane.add (meinPanel, BorderLayout.SOUTH);
    }

    //*******MIT DB VERBINDEN*******//
    public boolean verbinden()
    {
        //*******TREIBER LADEN*******//
        try
        {
            Class.forName("org.postgresql.Driver" );
            System.out.println("Treiber geladen");
        }
        catch (ClassNotFoundException ex)
        {
            System.out.println("Treiber nicht gefunden!");
            //statusMessageLabel.setText ("Treiber nicht gefunden!");
        }

        //*******MIT DB VERBINDEN*******//
        try
        {
            meineDB.conn = DriverManager.getConnection ( "","","");
        }
        catch (SQLException sqlex)
        {
            System.out.println(sqlex.getMessage ());
            //statusMessageLabel.setText("Verbindung fehlgeschlagen!");
            System.out.println("DB nicht verfügbar");
        }
        return true;
    }

    //*******VON DB TRENNEN*******//
    public boolean trennen()
    {
        try
        {
            meineDB.conn.close();
        }
        catch (Exception exs)
        {
            exs.printStackTrace();
            System.out.println("Keine Verbindung!");
        }
        return true;
    }
};
```

Die Exception tritt in der MyTable.java genau hier auf:


```
while (meineDB.rs.next ())
```

nämlich wenn ich das ResultSet durchlaufen will.
Ich muss logischerweise erst ein MyDB-Objekt erzeugen, ehe ich das ResultSet durchlaufen kann. Das hab ich auch versucht, hat allerdings nicht funktioniert. Es kam nach wie vor die NullPointerException. Mir kommt es so vor, dass das ResultSet leer ist und er deswegen die Exception bringt.

Liegt es an der Reihenfolge? Hab ich hier wieder einen dummen Denkfehler? Ich denke mal was großes kann es nicht sein.


```
///////////////////
//DATENBANKKLASSE//
///////////////////

package idics_db_viewv3;

import java.sql.*;

public class MyDB
{
    static Connection conn = null;
    static ResultSet rs;
    static Statement stmt;
    static String sql;
    static ResultSetMetaData rsmd;

    public static void readDB()
    {
        //*******DATENBANK-TABELLE AUSLESEN*******//
        try
        {
            rsmd = rs.getMetaData();
            sql = "SELECT * FROM st_user";
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            rs = stmt.executeQuery(sql);      
        }
        catch (Exception exce)
        {
            System.out.println(exce.toString());
        }      
    }
}
```

Es wäre schön wenn sich jemand erbarmen könnte dieses Thema weiter zu verfolgen


----------



## Michael... (25. Jun 2009)

Der Code ist ja nicht gerade einfach zu lesen. Soweit ich das sehe ist das ResultSet nicht leer (das würde nichts ausmachen) sondern es ist null, deswegen auch die Exception. ich sehe nirgends den Aufruf der Methode readDB() in dem der ResultSet initialisiert wird.

Wieso erzeugst Du eigentlich ein Objekt von MyDB, wenn Du sowie so nur statische Variablen und Methoden hast bzw. warum machst Du da alles statisch?


----------



## schneffi (25. Jun 2009)

Michael... hat gesagt.:


> Der Code ist ja nicht gerade einfach zu lesen. Soweit ich das sehe ist das ResultSet nicht leer (das würde nichts ausmachen) sondern es ist null, deswegen auch die Exception. ich sehe nirgends den Aufruf der Methode readDB() in dem der ResultSet initialisiert wird.



Hm wie kann es null sein? 

Aufruf der Methode readDB() hab ich jetzt hier eingefügt (hab nochmal ne neue Methode showTable() geschrieben in der Hoffnung es liegt daran, also nicht wundern.


```
public void showTable()
    {
        MyDB.readDB ();
        try
        {
        while (MyDB.rs.next ())
        {
            dbdata = new Object[MyDB.rsmd.getColumnCount()];
            for (int i = 1; i <= MyDB.rsmd.getColumnCount(); i++)
            {
               dbdata [i-1] = MyDB.rs.getObject ( i );
            }
            list.add ( dbdata);
            String name = MyDB.rs.getString("bezeichnung");
            System.out.println("Name: " +name);
        }
```



Michael... hat gesagt.:


> Wieso erzeugst Du eigentlich ein Objekt von MyDB, wenn Du sowie so nur statische Variablen und Methoden hast bzw. warum machst Du da alles statisch?



Statisch deshalb, weil ein Schlaumeier hier (im Büro) gesagt hat ich solle das besser machen, damit das ResultSet im Speicher bleibt. Ich dachte aber unter static versteht man etwas anderes.

Weil du meintest mein code wäre schwer zu lesen: ist er unübersichtlich? Kann man in der Hinsicht was verbessern? So bewandert bin ich doch in der Materie nun auch noch nicht..was die ganze Softwareentwicklung angeht.


----------



## Michael... (25. Jun 2009)

schneffi hat gesagt.:


> Statisch deshalb, weil ein Schlaumeier hier (im Büro) gesagt hat ich solle das besser machen, damit das ResultSet im Speicher bleibt


Da würde ich mir die Frage stellen, will ich das überhaupt und habe ich etwas davon


schneffi hat gesagt.:


> Weil du meintest mein code wäre schwer zu lesen: ist er unübersichtlich? Kann man in der Hinsicht was verbessern?


Man könnte die graphischen Umfänge von den Datenbank Themen trennen.
Die Datenbank-Klasse kümmert sich um den Verbindungsaufbau/abbau und die Aufbereitung der Daten
Der Frame enthält die Table und deren Model und sagt der Datenbank-Klasse verbinde Dich zur Datenbank, gibt mir die Spaltennamen, gibt mir den Datensatz, beende die Verbindung


----------



## schneffi (25. Jun 2009)

Michael... hat gesagt.:


> Man könnte die graphischen Umfänge von den Datenbank Themen trennen.
> Die Datenbank-Klasse kümmert sich um den Verbindungsaufbau/abbau und die Aufbereitung der Daten
> Der Frame enthält die Table und deren Model und sagt der Datenbank-Klasse verbinde Dich zur Datenbank, gibt mir die Spaltennamen, gibt mir den Datensatz, beende die Verbindung



Das klingt logisch. Und wäre dann auch übersichtlicher. Danke.

Trotzdem ist da das Problem mit der Exception noch nicht geklärt


----------



## Michael... (25. Jun 2009)

In welcher Zeile tritt denn die Exception auf? Zeig doch mal die Ausgabe im Stacktrace.


----------



## schneffi (25. Jun 2009)

Michael... hat gesagt.:


> In welcher Zeile tritt denn die Exception auf? Zeig doch mal die Ausgabe im Stacktrace.




tritt auf in Zeile 6 in der MyTable.java:


```
public void showTable()
    {
        MyDB.readDB ();
        try
        {
        while (MyDB.rs.next ())  //*****NULLPOINTEREXCEPTION*****
        {
            dbdata = new Object[MyDB.rsmd.getColumnCount()];
            for (int i = 1; i <= MyDB.rsmd.getColumnCount(); i++)
            {
               dbdata [i-1] = MyDB.rs.getObject ( i );
            }
            list.add ( dbdata);
            String name = MyDB.rs.getString("bezeichnung");
            System.out.println("Name: " +name);
        }

//Anzahl Spalten
           int columns = MyDB.rsmd.getColumnCount();
           System.out.println ("Anzahl Spalten: " +columns);

         //Spaltennamen
           for (int i = 1; i <= columns; i++)
           {
               columnNames.addElement ( MyDB.rsmd.getColumnName ( i));
           }

         //Daten
           while (MyDB.rs.next ())
           {
               Vector row = new Vector (columns);
               for (int i = 1; i <= columns; i++)
               {
                   row.addElement ( row);
               }
           }
            MyDB.rs.close();
            MyDB.stmt.close();
        }
        catch (SQLException sqle)
        {
            System.out.println(sqle);
        }

        //*******DAS NEUE FENSTER FÜR DIE TABELLE*******//
        JTable meineTabelle = new JTable(data, columnNames);
        JScrollPane meinScrollPane = new JScrollPane(meineTabelle);
        Container contentPane = getContentPane();
        contentPane.add ( meinScrollPane);
        JPanel meinPanel = new JPanel ();
        contentPane.add (meinPanel, BorderLayout.SOUTH);

        MyTable frame = new MyTable();
        frame.setDefaultCloseOperation (0);
        frame.pack ();
        frame.setVisible(true);
    }

    //*******MIT DB VERBINDEN*******//
    public boolean verbinden()
    {
        //*******TREIBER LADEN*******//
        try
        {
            Class.forName("org.postgresql.Driver" );
            System.out.println("Treiber geladen");
        }
        catch (ClassNotFoundException ex)
        {
            System.out.println("Treiber nicht gefunden!");
            //statusMessageLabel.setText ("Treiber nicht gefunden!");
        }

        //*******MIT DB VERBINDEN*******//
        try
        {
           MyDB.conn = DriverManager.getConnection ( "jdbc:postgresql://localhost:5432/idics","idics_server","idicskannalles");
        }
        catch (SQLException sqlex)
        {
            System.out.println(sqlex.getMessage ());
            //statusMessageLabel.setText("Verbindung fehlgeschlagen!");
            System.out.println("DB nicht verfügbar");
        }

        return true;
    }


    //*******VON DB TRENNEN*******//
    public boolean trennen()
    {
        try
        {
            MyDB.conn.close();
        }
        catch (Exception exs)
        {
            exs.printStackTrace();
            System.out.println("Keine Verbindung!");
        }
        return true;
    }
};
```


Die Exception:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
java.lang.NullPointerException
        at idics_db_viewv3.MyTable.showTable(MyTable.java:32)
        at idics_db_viewv3.Idics_db_viewV3View.jButton3ActionPerformed(Idics_db_viewV3View.java:236)
        at idics_db_viewv3.Idics_db_viewV3View.access$1000(Idics_db_viewV3View.java:22)
        at idics_db_viewv3.Idics_db_viewV3View$6.actionPerformed(Idics_db_viewV3View.java:141)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6134)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5899)
        at java.awt.Container.processEvent(Container.java:2023)
        at java.awt.Component.dispatchEventImpl(Component.java:4501)
        at java.awt.Container.dispatchEventImpl(Container.java:2081)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
        at java.awt.Container.dispatchEventImpl(Container.java:2067)
        at java.awt.Window.dispatchEventImpl(Window.java:2458)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


----------



## Michael... (25. Jun 2009)

Ist ohne vollständigen Code schwer zu sagen woran das liegt.
Wird sonst noch was auf der Konsole ausgegeben?

Füge doch einfach mal vor der Zeile sowas wie

```
System.out.println(MyDB.conn==null);
System.out.println(MyDB.rs==null);
```
Was wird dann ausgegeben?


----------



## schneffi (25. Jun 2009)

beim ersten kommt: false
beim zweiten kommt: null

hiernochmal der vollständige Code:


```
////////////////////
//TABELLENKLASSE////
//TABELLENSTRUKTUR//
////////////////////

package idics_db_viewv3;

import java.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;

public class MyTable extends JFrame
{
    JFrame tableFrame = new JFrame();
    JPanel tablePanel = new JPanel();
    JScrollPane tableScrollPane = new JScrollPane();
    DefaultTableModel model = new DefaultTableModel();
    JTable MyTable = new JTable(model);
    LinkedList list = new LinkedList();
    Vector columnNames = new Vector();
    Vector data = new Vector();
    Object[] dbdata;


    public void showTable()
    {
        MyDB.readDB ();
        //MyDB.rs=null;
        {
            try
            {
        System.out.println(MyDB.conn==null);
        System.out.println (MyDB.rs=null);
        while (MyDB.rs.next ())
        {
            dbdata = new Object[MyDB.rsmd.getColumnCount()];
            for (int i = 1; i <= MyDB.rsmd.getColumnCount(); i++)
            {
               dbdata [i-1] = MyDB.rs.getObject ( i );
            }
            list.add ( dbdata);

            String name = MyDB.rs.getString("bezeichnung");
            System.out.println("Name: " +name);
        }
        }

         catch (SQLException sqle)
        {
            System.out.println(sqle);
        }
        

        try{

        //Anzahl Spalten
           int columns = MyDB.rsmd.getColumnCount();
           System.out.println ("Anzahl Spalten: " +columns);

         //Spaltennamen
           for (int i = 1; i <= columns; i++)
           {
               columnNames.addElement ( MyDB.rsmd.getColumnName ( i));
           }

         //Daten
           while (MyDB.rs.next ())
           {
               Vector row = new Vector (columns);
               for (int i = 1; i <= columns; i++)
               {
                   row.addElement ( row);
               }
           }
            MyDB.rs.close();
            MyDB.stmt.close();
        }
        catch (Exception e)
        {
            System.out.println("superdoof" +e.toString ());
        }
       

        //*******DAS NEUE FENSTER FÜR DIE TABELLE*******//
        JTable meineTabelle = new JTable(data, columnNames);
        JScrollPane meinScrollPane = new JScrollPane(meineTabelle);
        Container contentPane = getContentPane();
        contentPane.add ( meinScrollPane);
        JPanel meinPanel = new JPanel ();
        contentPane.add (meinPanel, BorderLayout.SOUTH);

        MyTable frame = new MyTable();
        frame.setDefaultCloseOperation (0);
        frame.pack ();
        frame.setVisible(true);
    }
    }

    //*******MIT DB VERBINDEN*******//
    public boolean verbinden()
    {
        //*******TREIBER LADEN*******//
        try
        {
            Class.forName("org.postgresql.Driver" );
            System.out.println("Treiber geladen");
        }
        catch (ClassNotFoundException ex)
        {
            System.out.println("Treiber nicht gefunden!");
            //statusMessageLabel.setText ("Treiber nicht gefunden!");
        }

        //*******MIT DB VERBINDEN*******//
        try
        {
           MyDB.conn = DriverManager.getConnection ( "jdbc:postgresql://localhost:5432/idics","idics_server","idicskannalles");
        }
        catch (SQLException sqlex)
        {
            System.out.println(sqlex.getMessage ());
            //statusMessageLabel.setText("Verbindung fehlgeschlagen!");
            System.out.println("DB nicht verfügbar");
        }

        return true;
    }


    //*******VON DB TRENNEN*******//
    public boolean trennen()
    {
        try
        {
            MyDB.conn.close();
        }
        catch (Exception exs)
        {
            exs.printStackTrace();
            System.out.println("Keine Verbindung!");
        }
        return true;
    }
};
```


```
///////////////////
//DATENBANKKLASSE//
///////////////////

package idics_db_viewv3;

import java.sql.*;

public class MyDB
{
    static Connection conn;
    static ResultSet rs;
    static Statement stmt;
    static String sql;
    static ResultSetMetaData rsmd;

    public static boolean readDB()
    {
        //*******DATENBANK-TABELLE AUSLESEN*******//
        try
        {
            rsmd = rs.getMetaData();
            sql = "SELECT * FROM ST_USER";
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            rs = stmt.executeQuery(sql);
            rs.getStatement ( );
        }
        catch (Exception exce)
        {
            System.out.println(exce.toString());
        }
        return true;
    }
}
```


----------



## Michael... (25. Jun 2009)

schneffi hat gesagt.:


> ```
> System.out.println (MyDB.rs=null);
> ```


muss heißen System.out.println(MyDB.rs==null);

Ist das Dein kompletter Code? Habe jetzt nirgends gefunden wo die Verbindung zur Datenbank aufgebaut wird, also den Aufruf von verbinden()


----------



## schneffi (25. Jun 2009)

Michael... hat gesagt.:


> Ist ohne vollständigen Code schwer zu sagen woran das liegt.
> Wird sonst noch was auf der Konsole ausgegeben?
> 
> Füge doch einfach mal vor der Zeile sowas wie
> ...



okay, beim ersten kommt: false
beim zweiten kommt: true

demnach kann ich ja davon ausgehen, dass die Connection nicht aufgebaut ist
aber das ResultSet abgerufen werden kann.

Wie kann keine Verbindung bestehen? Aber hier jetzt der vollständige Code 


```
////////////////////
//TABELLENKLASSE////
//TABELLENSTRUKTUR//
////////////////////

package idics_db_viewv3;

import java.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;

public class MyTable extends JFrame
{
    JFrame tableFrame = new JFrame();
    JPanel tablePanel = new JPanel();
    JScrollPane tableScrollPane = new JScrollPane();
    DefaultTableModel model = new DefaultTableModel();
    JTable MyTable = new JTable(model);
    LinkedList list = new LinkedList();
    Vector columnNames = new Vector();
    Vector data = new Vector();
    Object[] dbdata;

    //*******MIT DB VERBINDEN*******//
    public boolean verbinden()
    {
        //*******TREIBER LADEN*******//
        try
        {
            Class.forName("org.postgresql.Driver" );
            System.out.println("Treiber geladen");
        }
        catch (ClassNotFoundException ex)
        {
            System.out.println("Treiber nicht gefunden!");
            //statusMessageLabel.setText ("Treiber nicht gefunden!");
        }

        //*******MIT DB VERBINDEN*******//
        try
        {
           MyDB.conn = DriverManager.getConnection ( "jdbc:postgresql://localhost:5432/idics","idics_server","idicskannalles");
        }
        catch (SQLException sqlex)
        {
            System.out.println(sqlex.getMessage ());
            //statusMessageLabel.setText("Verbindung fehlgeschlagen!");
            System.out.println("DB nicht verfügbar");
        }

        return true;
    }

    public void showTable()
    {
        try
        {
            System.out.println(MyDB.conn==null);
            System.out.println(MyDB.rs==null);
            while (MyDB.rs.next ())
            {
                dbdata = new Object[MyDB.rsmd.getColumnCount()];
                for (int i = 1; i <= MyDB.rsmd.getColumnCount(); i++)
                {
                    dbdata [i-1] = MyDB.rs.getObject ( i );
                }
                list.add ( dbdata);

                String name = MyDB.rs.getString("bezeichnung");
                System.out.println("Name: " +name);
            }
            }

         catch (SQLException sqle)
         {
            System.out.println(sqle);
         }
        
        try
        {
        //Anzahl Spalten
           int columns = MyDB.rsmd.getColumnCount();
           System.out.println ("Anzahl Spalten: " +columns);

         //Spaltennamen
           for (int i = 1; i <= columns; i++)
           {
               columnNames.addElement ( MyDB.rsmd.getColumnName ( i));
           }

         //Daten
           while (MyDB.rs.next ())
           {
               Vector row = new Vector (columns);
               for (int i = 1; i <= columns; i++)
               {
                   row.addElement ( row);
               }
           }
            MyDB.rs.close();
            MyDB.stmt.close();
        }
        catch (Exception e)
        {
            System.out.println("superdoof" +e.toString ());
        }

        //*******DAS NEUE FENSTER FÜR DIE TABELLE*******//
        JTable meineTabelle = new JTable(data, columnNames);
        JScrollPane meinScrollPane = new JScrollPane(meineTabelle);
        Container contentPane = getContentPane();
        contentPane.add ( meinScrollPane);
        JPanel meinPanel = new JPanel ();
        contentPane.add (meinPanel, BorderLayout.SOUTH);

        MyTable frame = new MyTable();
        frame.setDefaultCloseOperation (0);
        frame.pack ();
        frame.setVisible(true);
    }
    

    //*******VON DB TRENNEN*******//
    public boolean trennen()
    {
        try
        {
            MyDB.conn.close();
        }
        catch (Exception exs)
        {
            exs.printStackTrace();
            System.out.println("Keine Verbindung!");
        }
        return true;
    }
};
```


```
///////////////////
//DATENBANKKLASSE//
///////////////////

package idics_db_viewv3;

import java.sql.*;

public class MyDB
{
    static Connection conn;
    static ResultSet rs;
    static Statement stmt;
    static String sql;
    static ResultSetMetaData rsmd;

    public static boolean readDB()
    {
        //*******DATENBANK-TABELLE AUSLESEN*******//
        try
        {
            rsmd = rs.getMetaData();
            sql = "SELECT * FROM ST_USER";
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            rs = stmt.executeQuery(sql);
        }
        catch (Exception exce)
        {
            System.out.println(exce.toString());
        }
        return true;
    }
}
```


```
public static void main(String[] args) 
    {
        //Laden der GUI
        launch(Idics_db_viewV3App.class, args);

        MyTable frame = new MyTable();
        frame.setDefaultCloseOperation (0);
        frame.pack ();
        frame.setVisible(true);
    }
```


----------



## Michael... (25. Jun 2009)

schneffi hat gesagt.:


> okay, beim ersten kommt: false
> beim zweiten kommt: true
> 
> demnach kann ich ja davon ausgehen, dass die Connection nicht aufgebaut ist
> aber das ResultSet abgerufen werden kann.


Nein die Verbindung ist aufgebaut, aber der ResultSet ist nich initialisiert - warum auch immer.


----------



## schneffi (25. Jun 2009)

Michael... hat gesagt.:


> Nein die Verbindung ist aufgebaut, aber der ResultSet ist nich initialisiert - warum auch immer.



also ich hab jetzt mal spassenshabler nicht auf verbinden geklickt sondern gleich auf "Datenbank anzeigen", da kam bei beiden true raus

Das versteh ich nicht, vorher hat es auch funktioniert! Kann es irgendwas damit zu tun haben, wie ich die Tabelle lade? Als ich es in der Konsole ausgegeben habe, ging es!


----------



## Michael... (25. Jun 2009)

Ehrlich gesagt steigt ich bei Deinem Code nicht so ganz durch ;-)
Probier mal folgendes bei Dir aus. Kann es mangels Treiber und Datenbankanbindung bei mir nicht testen. Vielleicht kannst Du ja darauf aufbauen.

```
import java.awt.*;
import java.sql.*;
import java.util.*;

import javax.swing.*;
import javax.swing.table.*;

public class DataBaseDemo  extends JFrame {
	private JTable table;
	private DefaultTableModel model;
	
	public DataBaseDemo() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(0, 0, 300, 500);
		this.setLocationRelativeTo(null);
		
		DataManager dm = new DataManager();
		model = new DefaultTableModel();
		if (dm.connect("jdbc:postgresql://localhost:5432/idics","idics_server","idicskannalles")) {
			Vector[] tableData = dm.loadData();
			model = new DefaultTableModel(tableData[0], tableData[1]);
			dm.disconnect();
		}
		table = new JTable(model);
		
		this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
	}
	
	public static void main(String[] args) {
		new DataBaseDemo().setVisible(true);
	}
}

class DataManager {
	private Connection con;
	private ResultSet rs;
	private ResultSetMetaData rsmd;
	
	public DataManager() {}
	
	public boolean connect(String url, String user, String pwd) {
        try {
			Class.forName("org.postgresql.Driver" ); 
	        System.out.println("Treiber geladen");
	        con = DriverManager.getConnection (url, user, pwd);
	        return true;
        }
        catch (Exception exc) {exc.printStackTrace();}
		return false;
	}
	
	public void disconnect() {
		try {
			con.close();
		}
		catch (Exception exc) {exc.printStackTrace();}
	}
	
	public Vector[] loadData() {
		Vector names = new Vector();
		Vector data = new Vector();
		Vector[] resultVector = new Vector[]{data, names};
		try {
			Statement stmt = con.createStatement();
			rs = stmt.executeQuery("SELECT * FROM st_user");
			rsmd = rs.getMetaData();
			int columns = rsmd.getColumnCount();
			for (int i=1; i<=columns; i++)
				names.addElement(rsmd.getColumnName(i));
			
			Vector row;
			while(rs.next()) {
				row = new Vector();
				for (int i=1; i<=columns; i++) {
					row.addElement(rs.getObject(i));
				}
				data.addElement(row);
			}
		}
		catch (Exception exc) {exc.printStackTrace();}
		return resultVector;
	}
}
```


----------



## schneffi (25. Jun 2009)

iust das alles in einer Datei?


----------



## Michael... (25. Jun 2009)

Ja, die Datei muss DataBaseDemo.java heißen.


----------



## schneffi (25. Jun 2009)

okay, also er bringt keine Fehler, was schonmal gut ist.
Allerdings zeigt er die Tabelle noch nicht an, aber ich denke mal, da muss ich das dann in einen neuen Frame laden.

Hab jetzt einen neuen Frame erzeugt und dort die Klasse reingetan. Werd nochmal alles in eine Datei tun, dann gucken was passiert, und wenn es funktioniert, werd ich das auf meine DB-Anwendung anwenden.

Danke schonmal


----------



## schneffi (25. Jun 2009)

```
public static boolean readDB()
    {
        //*******DATENBANK-TABELLE AUSLESEN*******//
        try
        {
            sql = "SELECT * FROM ST_USER;";
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            rs = stmt.executeQuery(sql);
            rsmd = rs.getMetaData(); 
        }
        catch (Exception exce)
        {
            System.out.println("readdb:"+exce.toString());
        }
        return true;
    }
```

Zeile 9 muss ganz unten hin, nicht ganz oben....da lag erstmal der Fehler. Also die DB-Verbindung funktioniert, jetzt bin ich wieder beim alten Thema, das ich diese verdammte Tabelle in den neuen Frame kriegen muss.

Aber ich danke dir erstmal für deine Hilfe, und ich werd auf jeden Fall deinen Vorschlag auch nochmal ausprobieren, das war ja ein bisschen anders als ich es hatte.


----------



## Michael... (25. Jun 2009)

Mi.. ist mir gar nicht aufgefallen. Aber dann hätte die VM ja vor der NullPointerException auch noch das auf der Konsole ausgeben müssen:


schneffi hat gesagt.:


> ```
> System.out.println("readdb:"+exce.toString());
> ```


----------



## schneffi (25. Jun 2009)

So, an alle Mitleser, ich habe es immerhin geschafft die Spaltennamen anzuzeigen und die Tabelle im neuen Frame zu öffnen:

EDIT: Ich habs hinbekommen! Die Daten werden ausgelesen und in einem neuen Fenster ausgegeben. Der Rest ist nur noch Feinarbeit, d.h. Klassen ordnen, übersichtlich machen, Spaltengröße, Frameposition....

Danke an Michael... für die großartige Mithilfe 



```
/////////////////
//HAUPTPROGRAMM//
/////////////////

package idics_db_viewv3;

import org.jdesktop.application.Application;
import org.jdesktop.application.SingleFrameApplication;

public class Idics_db_viewV3App extends SingleFrameApplication {

    @Override protected void startup() {
        show(new Idics_db_viewV3View(this));
    }

    @Override protected void configureWindow(java.awt.Window root) {
    }

    public static Idics_db_viewV3App getApplication() {
        return Application.getInstance(Idics_db_viewV3App.class);
    }

    public static void main(String[] args) 
    {
        //Laden der GUI
        launch(Idics_db_viewV3App.class, args);
    }
}
```



```
////////////////////
//TABELLENKLASSE////
//TABELLENSTRUKTUR//
////////////////////

package idics_db_viewv3;

import java.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;

public class MyTable extends JFrame
{
    //gehört zu siehe unten ***Ausgabe in Konsole***
    //LinkedList list = new LinkedList();
    Object[] dbdata;
    MyDB meineDB = new MyDB();

    //*******MIT DB VERBINDEN*******//
    public boolean verbinden()
    {
        //*******TREIBER LADEN*******//
        try
        {
            Class.forName("org.postgresql.Driver" );
            System.out.println("Treiber geladen");
        }
        catch (ClassNotFoundException ex)
        {
            System.out.println("Treiber nicht gefunden!");
            //statusMessageLabel.setText ("Treiber nicht gefunden!");
        }

        //*******MIT DB VERBINDEN*******//
        try
        {
           meineDB.conn = DriverManager.getConnection ( "jdbc:postgresql://localhost:5432/idics","...","...");
           System.out.println ("Verbindung hergestellt!");
        }
        catch (SQLException sqlex)
        {
            System.out.println(sqlex.getMessage ());
            //statusMessageLabel.setText("Verbindung fehlgeschlagen!");
            System.out.println("DB nicht verfügbar");
        }
        return true;
    }

    public void showTable()
    {
       Vector columnNames = new Vector();
       Vector data = new Vector();

        //*******Auslesen der Datenbank*******//
        try
        {
            meineDB.readDB ();
        //Anzahl Spalten
           int columns = meineDB.rsmd.getColumnCount();
           System.out.println ("Anzahl Spalten: " +columns);

         //Spaltennamen auslesen
           for (int i = 1; i <= columns; i++)
           {
               columnNames.addElement ( meineDB.rsmd.getColumnName ( i));
           }
           System.out.println("Spaltennamen:" +columnNames);

           //Daten
           while (meineDB.rs.next ())
           {
               Vector row = new Vector (columns);
               for (int i = 1; i <= columns; i++)
               {
                   row.addElement ( meineDB.rs.getObject ( i )); 
               }
               data.addElement ( row );
           }
            meineDB.rs.close();
            meineDB.stmt.close();
        }
        catch (Exception e)
        {
            System.out.println(e.toString ());
        }

       //*******DAS NEUE FENSTER FÜR DIE TABELLE*******//
        JTable meineTabelle = new JTable(data,columnNames);
        JFrame frame = new JFrame();
        Container content = frame.getContentPane ();
        content.add ( new JScrollPane(meineTabelle));
        frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    //*******VON DB TRENNEN*******//
    public boolean trennen()
    {
        try
        {
            meineDB.conn.close();
        }
        catch (Exception exs)
        {
            exs.printStackTrace();
            System.out.println("Keine Verbindung!");
        }
        return true;
    }
};
```



```
///////////////////
//DATENBANKKLASSE//
///////////////////

package idics_db_viewv3;

import java.sql.*;
import java.lang.Object;

public class MyDB
{
    Connection conn;
    ResultSet rs;
    Statement stmt;
    String sql;
    ResultSetMetaData rsmd;

    public boolean readDB()
    {
        //*******DATENBANK-TABELLE AUSLESEN*******//
        try
        {
            sql = "SELECT * FROM st_user;";
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            rs = stmt.executeQuery(sql);
            rsmd = rs.getMetaData();
        }
        catch (Exception exce)
        {
            System.out.println("readdb:"+exce.toString());
        }
        return true;
    }
}
```



```
////////////////////////
//GRAFISCHE OBERFLÄCHE//
////////////////////////
MyTable myTab = new MyTable();

    private void jButton3ActionPerformed (java.awt.event.ActionEvent evt)                                         
    {                                             
        myTab.showTable ();
    }                                        

    private void jButton1ActionPerformed (java.awt.event.ActionEvent evt)                                         
    {                                             
        myTab.verbinden();
    }                                        

    private void jButton2ActionPerformed (java.awt.event.ActionEvent evt)                                         
    {                                             
        myTab.trennen();
    }
```

(hier nur das, was wichtig ist, der Rest wird ja von NetBeans automatisch reingemacht)


----------



## schneffi (3. Jul 2009)

So, jetzt wollte ich alles noch ein bisschen ordnen, und sobald ich die methoden verbinden()  und trennen() in meine Datenbankklasse schiebe, bekomme ich eine NullpointerException. Ich denke es liegt an meiner Tabellenklasse, aber nach einer Stunde debuggen mit wachsamem Auge konnte ich nichts finden 


Tabellenklasse:


```
public class MyTable extends JTable
{
    Object[] dbdata;
    MyDB meineDB = new MyDB();

    //Achtung hier Übungscode
    public JTable autoResizeColWidth (JTable meineTabelle, DefaultTableModel model)
    {
            int margin = 5;
            try
            {
                for (int i = 0; i < meineDB.rsmd.getColumnCount (); i++)
                {
                    int vColIndex = i;
                    DefaultTableColumnModel colModel = (DefaultTableColumnModel) meineTabelle.getColumnModel ();
                    TableColumn col = colModel.getColumn(vColIndex);
                    int width = 0;

                    //Breite des Headers
                    TableCellRenderer renderer = col.getHeaderRenderer ();
                    if (renderer == null)
                    {
                        renderer = meineTabelle.getTableHeader ().getDefaultRenderer ();
                    }
                    Component comp = renderer.getTableCellRendererComponent (meineTabelle, col.getHeaderValue (), false, false, 0,0 );
                    width = comp.getPreferredSize ().width;

                    //max. Breite der Datensätze
                    for (int r = 0; r < meineTabelle.getRowCount (); r++)
                    {
                        renderer = meineTabelle.getCellRenderer ( r, vColIndex);
                        comp = renderer.getTableCellRendererComponent ( meineTabelle,
                            meineTabelle.getValueAt ( r, vColIndex ), false, false, r, vColIndex);
                        width = Math.max ( width, comp.getPreferredSize ().width);
                    }

                    //Rand hinzufügen
                    width += 2 * margin;

                    //Breite festlegen
                    col.setPreferredWidth ( width);
                }

                ((DefaultTableCellRenderer) meineTabelle.getTableHeader ().getDefaultRenderer ()).setHorizontalAlignment ( SwingConstants.LEFT );

                //meineTabelle.setAutoCreateRowSorter(true)
                meineTabelle.getTableHeader ().setReorderingAllowed (
                    false);

                for (int i = 0; i < meineDB.rsmd.getColumnCount (); i++)
                {
                    TableColumn column = meineTabelle.getColumnModel ().getColumn (
                        i);
                }
            }

                catch (Exception e)
                {
                    System.out.println("Fehler");
                }
            return meineTabelle;

public void showTable()
    {
       Vector columnNames = new Vector();
       Vector data = new Vector();
       DefaultTableModel model = new DefaultTableModel();
            
        try
        {
        //Anzahl Spalten
           int columns = meineDB.rsmd.getColumnCount();
           System.out.println ("Anzahl Spalten: " +columns);
        

         //Spaltennamen auslesen
           for (int i = 1; i <= columns; i++)
           {
               columnNames.addElement ( meineDB.rsmd.getColumnName ( i));
           }
           System.out.println("Spaltennamen:" +columnNames);

           //*******DAS NEUE FENSTER FÜR DIE TABELLE*******//
            JTable meineTabelle = new JTable(data,columnNames);
            meineTabelle = autoResizeColWidth(meineTabelle, model);
            meineTabelle.setAutoResizeMode ( JTable.AUTO_RESIZE_OFF);
            meineTabelle.setAutoCreateRowSorter ( true);
//            meineTabelle.setModel ( model);

            JFrame frame = new JFrame();
            frame.setSize ( 800, 500);
            frame.setLocation (200,300);
            Container content = frame.getContentPane ();
            content.setSize ( 800, 500);
            content.setLocation ( 200, 300);
            content.add ( new JScrollPane(meineTabelle));
            frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);

            //*******Auslesen der Datenbank*******//

           //Daten
           while (meineDB.rs.next ())
           {
               Vector row = new Vector (columns);
               for (int i = 1; i <= columns; i++)
               {
                   row.addElement ( meineDB.rs.getObject ( i ));
               }
               data.addElement ( row );
           }

            meineDB.rs.close();
            meineDB.stmt.close();
        }
        catch (Exception e)
        {
            System.out.println(e.toString ());
        }       
    }

        }
```

Datenbankklasse:


```
package idics_db_viewv3;

import java.sql.*;

public class MyDB
{
    Connection conn;
    ResultSet rs;
    Statement stmt;
    String sql;
    ResultSetMetaData rsmd;

    //*******MIT DB VERBINDEN*******//
    public boolean verbinden()
    {
        //*******TREIBER LADEN*******//
        try
        {
            Class.forName("org.postgresql.Driver" );
            System.out.println("Treiber geladen");
        }
        catch (ClassNotFoundException ex)
        {
            System.out.println("Treiber nicht gefunden!");
            //statusMessageLabel.setText ("Treiber nicht gefunden!");
        }

        //*******MIT DB VERBINDEN*******//
        try
        {
           conn = DriverManager.getConnection ( "jdbc:postgresql://localhost:5432/idics","idics_server","idicskannalles");
           System.out.println ("Verbindung hergestellt!");
        }
        catch (SQLException sqlex)
        {
            System.out.println(sqlex.getMessage ());
            //statusMessageLabel.setText("Verbindung fehlgeschlagen!");
            System.out.println("DB nicht verfügbar");
        }
        return true;
    }

    //*******VON DB TRENNEN*******//
    public boolean trennen()
    {
        try
        {
            conn.close();
        }
        catch (Exception exs)
        {
            exs.printStackTrace();
            System.out.println("Keine Verbindung!");
        }
        return true;
    }

    public boolean readDB()
    {
        //*******DATENBANK-TABELLE AUSLESEN*******//
        try
        {
            sql = "SELECT id, revcuser, bezeichnung, mandant FROM st_user;";
            System.out.println("SELECT*FROM st_user;");

            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            System.out.println("stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); ");

            rs = stmt.executeQuery(sql);
            System.out.println("rs=stmt.executeQuery(sql);");

            rsmd = rs.getMetaData();
            System.out.print ( "rsmd=rs.getMetaData();"); 
        }
        catch (Exception exce)
        {
            System.out.println("readdb:"+exce.toString());
        }
        return true;
    }
}
```

Unten raus kommt:

Treiber geladen
Verbindung hergestellt!
SELECT*FROM st_user;
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
rs=stmt.executeQuery(sql);
rsmd=rs.getMetaData();*java.lang.NullPointerException*

Also die Daten werden ausgelesen, das funktioniert. Ich denke das Problem liegt irgendwo in der Tabellenklasse. Kann es sein, dass die Tabellenklasse noch irgendein Parameter haben will, aber nichts übergeben bekommt von der Datenbankklasse?


----------



## schneffi (7. Jul 2009)

problem gelöst...


----------

