Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen

Burkhard

Mitglied
Hallo, liebe Java Gemeinde,

dies ist mein erster Post. Kurze Vorstellung meinerseits:

ich bin im Ruhestand (73). Habe Erfahrung mit Delphi, Lazarus und QT in der GUI Programmierung insbesondere schwerpunktmäßig mit Datenbanken sammeln dürfen.

Java ist für mich (fast) Neuland, habe aber früher bereits mit Netbeans und openjdk ein bißchen GUI Programmierung gemacht. Das ist allerdings einige Jahre her und mittlerweile ein wenig verblaßt.

Arbeite unter Debian (bookworm), und habe erfolgreich openjdk 17 (komplett) installiert mit der Netbeans IDE 17.1

Die letzten Tage habe ich ausschließlich kleine Java Swing Programme manuell mit Geany erstellt, um die Grundlagen aufzufrischen. Compilieren, Manifest Datei erstellen und jar Dateien erstellen funktioniert ohne Probleme. Jetzt arbeite ich mit Netbeans weiter. In Netbeans habe ich die Embedded Datenbank H2 als neue Library registriert und dann den Treiber ebenfalls installiert. Auch das funktioniert. Dann habe ich mit der H2 Console über meinen Browser Firefox eine neue Datenbank Kontakte angelegt mit einer neuen Tabelle adressen. Diese hat nur 2 Felder ID (integer) und Name (varchar). Ist ja zuerst nur eine kleine Probedatenbank zum Üben. Dann habe ich 5 Datensätze hinzugefügt. Die Verbindung funktioniert, das normale administrieren mit SQL Befehlen ebenfalls.

Nun habe ich in Netbeans ein neues Ant Projekt Datenbank angelegt und einen neuen Swing Frame db_frame. In den Projekteigenschaften habe ich den db_frame als Main Class festgelegt. Dann habe ich einen neuen Button namens Verbindung auf den Frame gelegt und mit einem Event und folgendem Inhalt:

Java:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
       
        String jdbcURL = "jdbc:h2:~/home/burkhard/Arbeit/Entwicklung/Java/db/H2/db/kontakte";
        String username = "";
        String password = "";
       
        try{
   
Connection connection = DriverManager.getConnection(jdbcURL, username, password);

JOptionPane.showMessageDialog(null, "Verbindung erfolgreich");

 String sql = "SELECT * FROM adressen";
 
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);
 
        int count = 0;
 
        while (resultSet.next()) {
            count++;
 
            int ID = resultSet.getInt("ID");
            String name = resultSet.getString("name");
           
     System.out.println("adressen #" + count + ": " + ID + ", " + name);
        }

        connection.close();

      } catch (SQLException e) {
         e.printStackTrace();
      }
     
    }

Im Projekt habe ich unter Libraries den Treiber für H2 hinzugefügt.

Dann das ganze compiliert und eine Jar Datei erstellt. Alles funktioniert, die Verbindung wird hergestellt und die 5 Datensätze ausgegeben (allerdings bisher noch auf der Konsole). Nun möchte ich aber das ResultSet (nennt man das so?) in einer JTable ausgeben anstatt auf der Konsole. Wenn ich eine JTable auf den Frame setze, wie bekomme eine Verbindung zwischen dem ResultSet und JTable hin, denn das Ergebnis meiner Abfrage soll ja in der Tabelle JTable dargestellt werden? Hab natürlich recherchiert, aber es gibt so viele Möglichkeiten, die ich noch nicht alle einordnen kann, um die JTable so zu konfigurieren, das der Inhalt angezeigt wird. Hier benötige ich jetzt Eure Hilfe, damit ich weiterkomme.

Ein bißchen Beispielcode wäre sehr hilfreich.

Erst mal vielen Dank, ich hoffe, ich habe genug Angaben gemacht, so das mir weiter geholfen werden kann.

liebe Grüße Burkhard
 

Burkhard

Mitglied

Oneixee5

Top Contributor
Danke, ich erarbeite mir gerade eine eigene Lösung. Es geht viel einfacher als wie das sehr alte Oracle Tutorial. Ich poste dann die Lösung Schritt für Schritt, damit auch andere davon profitieren können. Wird ein wenig dauern, ich melde mich dann wieder.

Grüße Burkhard
Hauptsache nicht mit 2-Dimensionalen-Arrays!
 

Burkhard

Mitglied
Naja, das Tutorial implementiert ein allgemein gehaltenes TableModel auf Basis einer RowSet-Implementierung. Dieses TableModel lässt sich wiederverwenden, um auf einfache Art und Weise eine Tabelle aus einer Datenbank in einer JTable anzuzeigen.

Hallo mihe7,

ich habe mir den Code angesehen, aber bei der Compilierung hagelte es Fehler. Und da ich erst am Anfang stehe, bin ich damit überfordert. Das ein TableModel erzeugt werden muß und das Model der JTable zugeordent wird, habe ich bereits in anderen Tutorials gesehen. Ich bin gerne bereit zu lernen, sonst hätte ich ja nicht mit Java anzufangen brauchen. aber Lernaufwand ist dann von der investierten Zeit ziemlich hoch. Es gibt auch Videos auf youtube, allerdings ist die Darstellungsqualität nicht wirklich gut. Hab eine kleine Pause gemacht und gehe dann wieder an den Start. Denn ich gebe nicht auf.

Gruß Burkhard
 

Burkhard

Mitglied
Den Quelltext hast Du gesehen? https://docs.oracle.com/javase/tuto...m/oracle/tutorial/jdbc/CoffeesTableModel.java

EDIT: wobei ich von AbstractTableModel ableiten würde, anstatt TableModel zu implementieren.
Danke, werde das jetzt mal etwas genauer studieren. Gesehen hatte ich den Quelltext schon, war aber abgeschreckt, weil bereits das compilieren nicht funktionierte. Bevor ich ein Forum bemühe, habe ich natürlich im Netz recherchiert und ausgiebig Beispiele aus dem Netz durchgearbeitet. Es gibt auch viele gute Tutorials über Java oder Java Swing, allerdings umschiffen die meisten Jtable, warum auch immer. scheint ja auch nicht so trivial zu sein.

Gruß Burkhard
 

mihe7

Top Contributor
Ja, JTable ist relativ komplex, allerdings nicht allzu schwer zu verstehen, wenn man das MVC-Pattern kennt bzw. verstanden hat. Stark vereinfacht ist JTable ist eine Komponente, die ein TableModel anzeigt. TableModel ist ein Interface. D. h. die JTable interessiert es nicht, woher die Daten stammen, einzig der mit dem TableModel festgehaltene "Vertrag" muss eingehalten werden.

Für die reine Anzeige muss JTable im Wesentlichen nur wissen: a) welche/wie viele Spalten gibt es, b) wie viele Zeilen gibt es, c) was ist der Wert einer bestimmten Zelle.

Das ist hochflexibel, denn dadurch kann eine JTalbe an alles "angeschlossen" werden, was sich in einer einfachen Tabelle darstellen lässt.

Natürlich ist das immer noch stark vereinfacht, aber darauf kann man aufbauen. So zeichnet eine JTable die Zellen nicht selbst, sondern verwendet hierfür TableCellRenderer (wieder ein Interface). Das hat den Hintergrund, dass eine einzige Komponente wie ein Stempel für zig Zellen verwendet werden kann (Flyweight Pattern). Die Spalten werden wiederum in einem TableColumnModel (wieder ein Interface) verwaltet. Die Auswahl einer oder mehrerer Zeilen werden über ein ListSelectionModel (Wer hätte es gedacht? Ein Interface) nachvollzogen. Ferner gibt es viele weitere Details, die man aber auch nur für Detailfragen kennen muss.
 

mihe7

Top Contributor
Ja, der Code verwendet JDBCTutorialUtilities.printSQLException. Entweder aus dem ZIP nehmen, oder
Java:
public class JDBCTutorialUtilities {
  public static boolean ignoreSQLException(String sqlState) {
    if (sqlState == null) {
      System.out.println("The SQL state is not defined!");
      return false;
    }
    // X0Y32: Jar file already exists in schema
    if (sqlState.equalsIgnoreCase("X0Y32"))
      return true;
    // 42Y55: Table already exists in schema
    if (sqlState.equalsIgnoreCase("42Y55"))
      return true;
    return false;
  }

  public static void printSQLException(SQLException ex) {
    for (Throwable e : ex) {
      if (e instanceof SQLException) {
        if (ignoreSQLException(((SQLException)e).getSQLState()) == false) {
          e.printStackTrace(System.err);
          System.err.println("SQLState: " + ((SQLException)e).getSQLState());
          System.err.println("Error Code: " + ((SQLException)e).getErrorCode());
          System.err.println("Message: " + e.getMessage());
          Throwable t = ex.getCause();
          while (t != null) {
            System.out.println("Cause: " + t);
            t = t.getCause();
          }
        }
      }
    }
  }
}
(fürchterlicher Code), oder einfach durch
Java:
e.printStackTrace();
ersetzen.
 

MisterBu

Aktives Mitglied
Nur um einen JTable aus einen Model zu erzeugen reichen zwei Zeilen
Java:
JobKurzModel jkm = new JobKurzModel();
JTable tab = new JTable(jkm);
Die eigentliche Schwierigkeit liegt im Model. Hier eine Beispiel:
Java:
package pack;
import java.util.*;
import javax.swing.table.*;
import java.sql.*;
public class JobKurzModel extends AbstractTableModel
{
    public static final long serialVersionUID = 1;
    private String[] columnNames = new String[7];
    private ArrayList<SatzJobKurz> al = new ArrayList<SatzJobKurz>();
    private DB2 db2 = new DB2();
    private Connection con = db2.connect();
    public JobKurzModel()
    {
        if (con != null)
        {
            ResultSet rs = db2.selectJobkurz(con,Parameter.typ);
            if (rs != null)
            {
                SatzJobKurz ts = db2.NextJobkurz(rs);
                int anz = 0;
                while (ts != null)
                {
                    String submitter = ts.getSubmitter().toUpperCase();
                    int lsub = submitter.length();
                    if (lsub > 6)
                    {
                        submitter = submitter.substring(0,6);
                    }
                    //if (!submitter.equals("P10137"))
                    if (true)
                    {
                        // System.out.println(submitter + lsub);
                        al.add(ts);
                        anz++;
                    }
                    ts = db2.NextJobkurz(rs);
                    if (anz > Parameter.maxJobKurz) ts = null;
                }
            }
            db2.close(con);
        }
        columnNames[0] = "Submitter";
        columnNames[1] = "JobName";
        columnNames[2] = "JobIdVon";
        columnNames[3] = "Zeit";
        columnNames[4] = "IPVon";
        columnNames[5] = "Typ";
        columnNames[6] = "Grant";
    }
    public ArrayList<SatzJobKurz> getAL()
    {
        return al;
    }
    public Object getValueAt(int row,int col)
    {
        SatzJobKurz ts = al.get(row);
        Object o = new Object();
        if (col == 0)
        {
            o = ts.getSubmitter();
        }
        if (col == 1)
        {
            // o = ts.getJobvon();
            String erg = "";
            String zeit = ts.getZeit();
            ArrayList<String> al = new ArrayList<String>();
            ResultSet rs = db2.selectJCL(con,zeit);
            if (rs != null)
            {
                String zeile = db2.NextJCL(rs);
                while (zeile != null)
                {
                    al.add(zeile);
                    zeile = db2.NextJCL(rs);
                }
                db2.closeJCL();
            }
            for (int i=0;i<al.size();i++)
            {
                String satz = al.get(i);
                String jobname = StringUtil.getJobname(satz);
                if (jobname != null)
                {
                    if (erg.equals(""))
                    {
                        erg += jobname;
                    }
                    else
                    {
                        erg += "+";
                    }
                }
            }
            o = erg;
        }
        if (col == 2)
        {
            o = ts.getJobidvon();
        }
        if (col == 3)
        {
            String s = new Zeit(ts.getZeit()).getFormattedZeit();
            o = s;
        }
        if (col == 4)
        {
            o = ts.getIpvon();
        }
        if (col == 5)
        {
            o = Parameter.typ;
        }
        if (col == 6)
        {
            o = ts.getGrant();
        }
        return o;
    }
    public int getRowCount()
    {
        int i = al.size();
        return i;
    }
    public int getColumnCount()
    {
        int i = 7;
        return i;
    }
    public String getColumnName(int col)
    {
        return columnNames[col];
    }
    public void setValueAt(Object value,int row,int col)
    {
        
    }
    public boolean isCellEditable(int row,int col)
    {
        return false;
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S MySQL JTable zeigt nach Datenbankabfrage eine Spalte zu viel an Datenbankprogrammierung 0
T Recordsets in eine JTable einlesen mit Netbeans 6.0 Datenbankprogrammierung 2
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
Zrebna PostgreSQL-Query in eine MicrosoftSQL-Query konvertieren - chatGPT hilft nur bedingt. Datenbankprogrammierung 3
T Spring MongoDB: Prüfen ob bereits eine Email existiert Datenbankprogrammierung 15
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Probleme bei Überführung von SQL-Code in eine HQL-Abfrage Datenbankprogrammierung 3
Zrebna Wie mittels PL/SQL eine Datenbankverbindung blockieren? Datenbankprogrammierung 6
berserkerdq2 Was genau muss ich bei date eingeben, wenn ich in Java eine Spalte definiere, die date ist? Datenbankprogrammierung 1
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
Kirby.exe Eine Tabelle updaten Datenbankprogrammierung 16
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
Z Aus zwei bestehenden Table eine zusätzliche Gemeinsame machen (JavaFX) Datenbankprogrammierung 21
Avalon Attribute werden mit Unterstrich in eine MySQL Datenbank eingetragen Datenbankprogrammierung 10
pkm PostgreSQL Auf eine Spalte kann aus einem Teil der SQL-Aussage nicht zugegriffen werden Datenbankprogrammierung 3
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
H suche eine Login system Bibliothek für Java Datenbankprogrammierung 5
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
G Eine Spalte in xampp als Typ array erstellen - ein array mit "insert" hinzufügen. Datenbankprogrammierung 3
F Create Table - Habe ich eine schwache Entität erzeugt ? Datenbankprogrammierung 4
Dimax MySQL Trigger für eine Spalte Datenbankprogrammierung 5
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
D MySQL Eibinden des "mysql-connector" in eine fertige Jar Datenbankprogrammierung 3
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
Thallius MySQL Tabelle splitten aber wie eine abfragen? Datenbankprogrammierung 10
B MySQL Eine Art Sverweis Datenbankprogrammierung 27
O HSQLDB Eine Entität, mehrere Tabellen Datenbankprogrammierung 8
B SQL-Statement Prüfen ob eine Spalte einen Wert enthält Datenbankprogrammierung 2
X SQLite Erhalte bei Query INSERT INTO eine NullPointerException Datenbankprogrammierung 10
L0MiN Wie kann ich eine bestimmte Seite aus verschiedenen Excel-Tabellen in eine neue Exceldatei kopieren? Datenbankprogrammierung 1
N Wie in Java Zugriffe und Updates auf eine Datenbank regeln ? Datenbankprogrammierung 1
E Wie kann ich aus diesem XML eine XMLTABLE-Funktion bauen? Datenbankprogrammierung 3
E Wie kann man mit einer ID-Spalte über eine Parameterübergabe auf eine Seite verweisen? Datenbankprogrammierung 17
A Eine MySQL Zeile mit JDBC löschen Datenbankprogrammierung 5
M Warum ist es suboptimal viele Indexe auf eine Datenbanktabelle zu setzen? Datenbankprogrammierung 4
L Datenmodell erstellen für eine Nutzertanalyse Datenbankprogrammierung 1
serjoscha MySQL Eine Instanz von eigenem DBWrapper -> Fehler durch mehrfachbenutzung möglich? Datenbankprogrammierung 2
S HSQLDB Verbieten eines update auf eine bestimmte reihe Datenbankprogrammierung 4
V HSQLDB Insert in eine Tabelle mit Autoincrement Datenbankprogrammierung 2
H Grosse Menge an Daten in eine Datenbank Datenbankprogrammierung 32
P MySQL eine richtige Datenbank für einen routenplaner erstellen Datenbankprogrammierung 2
D SQL Update auf eine Query möglich? Datenbankprogrammierung 4
S SqlObject - eine objektorientierte Art SQL-Statements zu schreiben. Datenbankprogrammierung 4
C Mit jsp über Java eine DB Abfrage durchführen --> java.lang.ClassNotFoundException Datenbankprogrammierung 4
K SQLite CSV-Datei einlesen in eine Datenbank Datenbankprogrammierung 7
E Datenbank Abfragen in eine GUI schreiben Datenbankprogrammierung 8
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
L MySQL MySql in eine Application einbinden? Datenbankprogrammierung 18
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
H Derby/JavaDB Eine verschlüsselte Derby-Datenbank wieder entschlüsseln Datenbankprogrammierung 4
D Was passiert bei absolut zeitgleichem Zugriff auf eine Tablerow Datenbankprogrammierung 7
I Belastet es das System zu sehr einen Timer jede 0.2 Sekunden eine DB Abfrage machen zu lassen? Datenbankprogrammierung 9
I Zugriff auf eine Datenbank auf dem Webserver Datenbankprogrammierung 2
F H2:Wie kann man insert eine Reihe "int" wert als blob in table? Datenbankprogrammierung 12
J mal wieder eine Frage zu parallelen Transaktionen.. Datenbankprogrammierung 2
Screen Ich suche eine SQLDatenbank ohne JDBC-Treiber Datenbankprogrammierung 12
H Derby/JavaDB SQLException wenn die Datenbank in eine Jar gepackt wurde. Datenbankprogrammierung 6
turmaline [Hibernate] @OneToMany - Eine referenzierte Tabelle abfragen Datenbankprogrammierung 11
S Werte aus Datenbank auslesen und in eine bestimmte Excelzelle eintragen Datenbankprogrammierung 2
T Wer kann mir eine Datenbank empfehlen Datenbankprogrammierung 13
DStrohma MS SQL Server 2005 + Java: Immer nur eine aktive Verbindung erlaubt? Datenbankprogrammierung 5
D MySQL Wie schreibe ich in eine Datenbank? Datenbankprogrammierung 8
J String[] in eine SQL-Anweisung implementieren Datenbankprogrammierung 13
Q Access Datenbank in eine Internetseite einbinden Datenbankprogrammierung 2
J Über einen Button eine SQL-DB aussuchen Datenbankprogrammierung 3
O eine Tabelle hat mehrere PrimKey mit dem selben Wert Datenbankprogrammierung 9
R Connection Problem für eine externe DB mit Java (JDBC) Datenbankprogrammierung 9
M Zugriff auf eine Access-Datenbank innerhalb eines jar-Files Datenbankprogrammierung 7
N Wie kann ich Zugriff auf eine MS Access DB (mit JDBC) über Netzwerk erreichen? Datenbankprogrammierung 7
G Wie sieht eine Datenbankverbindung mit jndi aus? Datenbankprogrammierung 3
T eine Datenbank updaten Datenbankprogrammierung 6
C Prüfen, ob eine MySQL-Tabelle bereits existiert Datenbankprogrammierung 7
E Wie auf eine MySql Datenbank zugreifen Datenbankprogrammierung 25
D Werte mit java programm in eine Datenbank einlesen Datenbankprogrammierung 7
T JPQL Query für eine Tabellenansicht Datenbankprogrammierung 2
B Wie persistiert man eine Tree-ähnliche Datenbankstruktur? Datenbankprogrammierung 2
M Aus einem Applet eine Datenbankverbindung starten? Datenbankprogrammierung 26
R Datenbankstruktur für eine renn simulation Datenbankprogrammierung 3
H Wie kann ich eine Datenbank Connection aus XML-Datei lesen! Datenbankprogrammierung 2
G Wie baut man eine Anwendung mit DB Zugriff Datenbankprogrammierung 3
S Als Rückgebewert eine Liste von Werten? Datenbankprogrammierung 3
A Auslesen von Werten aus der DB in eine csv-Datei Datenbankprogrammierung 4
O Oracle 11g wirft bei 90 % der installation eine Exception ? Datenbankprogrammierung 5
R Warum kommt eine Exception bei instanceof ? Datenbankprogrammierung 4
M Tabelle von einer Datenbank in eine Andere Datenbankprogrammierung 4
G Inhalt eine Clob Feldes zw. zwei DB's kopieren Datenbankprogrammierung 2
A Einlesen einer csv-Datei in eine H2-Datenbank Datenbankprogrammierung 3
A Kriterium für eine JList neu definieren Datenbankprogrammierung 3
A Probleme beim Schreiben in eine CSV-Datei aus einer H2-DB Datenbankprogrammierung 2
G Import einer csv-Datei in eine H2-Database Datenbankprogrammierung 12
J Warum ist es aufwendig eine Datenbankverbindung herzustellen Datenbankprogrammierung 3
M Mit Java .txt-Datei in eine Datenbank einlesen lassen Datenbankprogrammierung 33
S Zugriff auf eine große Datenmenge von MS Access per JDBC Datenbankprogrammierung 11
S von einer DB auf eine andere Zugreifen. Datenbankprogrammierung 2
W Wann ist eine Telefonnummer atomar ? Datenbankprogrammierung 3
D Dateien in eine OODB abspeichern Datenbankprogrammierung 3
A Eine einzelne Zeile schreibschützen im DataSet Datenbankprogrammierung 13
E 2 Tabellen anhand eine Spalte zusammenführen? Datenbankprogrammierung 5
M GUI für eine Datenbank Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben