# List in JTable anzeigen mit dynamischen Einträgen



## DerBuhl (26. Juli 2011)

Hallo,

ich bin dabei meine ersten Programme zu schreiben in Java und stehe nun vor einem Problem, was ich durch googlen und suchen bisher noch nicht lösen konnte. Daher versuche ich hier mal mein Glück und würd mich freuen wenn mir jemand antworten würde.

Folgendes Problem:
ich habe eine Liste "anzahl_list" und möchte die Einträge in dieser Liste in einer Jtable ausgegeben haben. Dies funktioniert auch soweit, aber nur mit der Angabe der verschiedenen Positionen in der Liste. Da die Liste aus einer Datenbank gefüllt wird, gibt es bei jedem Durchlauf unterschiedlich viele Einträge. Ich bräuchte jetzt irgendeine Funktion oder ähnliches, mit der ich bei:

String[][] rowData = { 

    { anzahl_list.get(0), anzahl_list.get(1), anzahl_list.get(2), anzahl_list.get(3), anzahl_list.get(4) },
    {  anzahl_list.get(5), anzahl_list.get(6), anzahl_list.get(7), anzahl_list.get(8), anzahl_list.get(9) }};

nicht immer 0,1,2 ... und so weiter, nicht immer händisch eintragen muss, sondern die Einträge dynamisch ermittelt werden. Ich habe an sowas wie "anzahl_list.get(all)" gedacht. Das gibt es aber leider nicht . Eine Schleife um "...rowData..." kann ich leider auch nicht packen, da diese Variable dann nachher nicht mehr für die JTable genutzt werden kann.

Unten der Code



> int anzahl = (nam_list.size());
> 
> int a = 0;
> int count = 0;
> ...


----------



## HonniCilest (27. Juli 2011)

Hallo und herzlich willkommen bei Tutorials.de,

Vorab ein paar kleine Anmerkungen, bitte setze Java-Code in die entsprechenden Code-Tags, Code zu quoten ist nicht schön, also einfach "Quote" durch "Java" ersetzen...

Dann meinerseits ein paar allgemeine Fragen...

```
int a=0;
while(a!=anzahl)
a++;
```
Wähle hierfür eine for-Schleife, dies sieht dann so aus:

```
for(int a=0; a!=anzahl; a++) { }
```
Du sagst die Daten kommen aus der Datenbank, wieso gehst du den Umweg über irgendwelche Listen?


----------



## DerBuhl (28. Juli 2011)

Danke erstmal für die Antwort und den Hinweis mit dem Code. Ich hoffe dieses mal ist es richtig 
Also diese while Schliefe habe ich gemacht, damit ich die Einträge dynamisch in die Liste schreiben kann. Jetzt brächte ich nur noch eine Funktion die diese Listeneinträge dynamisch in eine Tabelle überträgt.

Hier ist einmal der gesamte Code des Fensters:


```
package zumtesten;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import javax.swing.JTable;

import java.io.IOError;
import java.io.IOException;
import java.sql.*;

import java.util.List;
import java.util.ArrayList;

public class FindArtikle extends JFrame {


    private JButton button;                                                     // Instanzvariable für einen Button
    private JPanel panel;                                                       // Instanzvariable für einen Panel
    private JButton button1;
     private JButton button2;
     private JLabel oben;
     private JLabel unten;
     private JLabel abstand;
     private JLabel abstand2;
     private JLabel abstand3;
     private JLabel name;
     private JLabel abstand4;
     private JLabel abstand5;
     private JButton schrankpl;
     private JButton suchen;
     private JLabel abstand6;
     private JLabel abstand7;
     private JLabel Na;
     private JLabel Beschre;
     private JLabel Schr;
     private JLabel Tu;
     private JLabel Fa;
     private JTable table;
     private JLabel label;

     public FindArtikle()                                                         // Konstruktor

    {



         super("Fenster");                                                      // Aufruf des Konstruktors der Superklasse mit übergabe eines Strings
         setSize(300, 300);                                                     // Fenster auf Grösse 300x300
         setLocation (300,300);                                                 // Position auf 300x 300
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                        // Beim schliessen des Fensters --> Programm beenden
         setLayout(new BorderLayout(6,6));                                      // Ein Layout für JFrame festlegen

         panel= new JPanel(new GridLayout(8,9));                                // Ein Panel erzeugen mit GridLayout
                                                                                  // Einen Button erzeugen
         button1 = new JButton("Menü");
         button2 = new JButton("Beenden");
         schrankpl = new JButton ("Schrankplan");

         final TextField nametf = new TextField("", 30);

         unten = new JLabel("Version 1.0");
         oben = new JLabel ("Lagerungssoftware");
         abstand = new JLabel ("<html><b><font size='5'>Artikel suchen</font></b></html>");
         abstand2 = new JLabel ("");
         abstand3 = new JLabel ("");
         abstand4 = new JLabel ("");
         abstand5 = new JLabel ("");
         abstand6 = new JLabel ("");
         abstand7 = new JLabel ("");
         name = new JLabel("Artikelname:");
         suchen = new JButton("Suchen");

         panel.add(abstand);
         panel.add(abstand6);
         panel.add(abstand7);
         panel.add(abstand3);
         panel.add(name);         
         panel.add(nametf);
         panel.add(abstand2);
         panel.add(suchen);
         panel.add(abstand4);
         panel.add(abstand5);// Button auf Panel packen
         panel.add(button1);
         panel.add(button2);
         panel.add(schrankpl);

         button2.addActionListener( new ActionListener() {
         public void actionPerformed( ActionEvent e ) {
         System.exit( 0 );
            }
                } );

         button1.addActionListener( new ActionListener() {
             public void actionPerformed (ActionEvent e){
             AppWindow AppWindow4 = new AppWindow();
             }
         });

         schrankpl.addActionListener( new ActionListener() {
             public void actionPerformed (ActionEvent e) {
             schrankplan schrank = new schrankplan();
             }
         });


         suchen.addActionListener( new ActionListener() {
             public void actionPerformed (ActionEvent e) {
            String Name = nametf.getText();


    Statement stmt; // Ist ein Statement für die Benutzung mit SQL
    ResultSet rs;   // RS ist daszu da, damit man Daten aus der Datenbank lesen kann



          try {

          Class.forName("com.mysql.jdbc.Driver"); // lädt den Treiber

          String url = "jdbc:mysql://localhost:3306/lagerung"; // Der Pfad der Datenbank
          Connection con = DriverManager.getConnection(url, "root", "Admin"); // Hier wir eine Verbindung deklariert



          stmt = con.createStatement();  // Ist ein Statement für die Benutzung mit SQL

          rs = stmt.executeQuery("Select * from Artikel where Name Like '%"+ Name +"%'");                   // hier wird mit Hilfe eines Statements eine Anfrage (Query) an die Datenbank gestellt und in eine Objektvaiable gespeichert
          List<String> nam_list = new ArrayList<String>();
         
          while(rs.next()){                                                     //Diese Schleife wird verwendet um mit rs.getString das feld Name aus der Datenbank zu lesen
                 String Nam = rs.getString("Name");
                 nam_list.add(Nam);

                 String Beschrei = rs.getString("Beschreibung");
                 nam_list.add(Beschrei);

                 double Schran = rs.getDouble("Schrank");
                 String Schra = String.valueOf(Schran);
                 nam_list.add(Schra);

                 String Tue = rs.getString("Tuer");
                 nam_list.add(Tue);

                 String Fac = rs.getString("Fach");
                 nam_list.add(Fac);
                             }

 int anzahl = (nam_list.size());                                       // Hier wird die Anzahl der in nam_list gefundeen Einträge in einer Variable gespeichert
          
 int a = 0;                                                            // a wird für die while Schleife gebraucht, und mit anzahl vergleichen, damit die Schleife nur Anzahl mal läuft
 int count = 0;                                                        // Count wird bis 4 gezählt, damit nach 5 aufrufen einen Zeilenumbruch erfolgen kann

 List<String> anzahl_list = new ArrayList<String>();

 while(a!=anzahl){
             if (count==4){
             String na = nam_list.get(a);
             String br = na + "\n";
             anzahl_list.add(br);
             a++;
             count = 0;
                          }
 else {
             String na = nam_list.get(a);
             anzahl_list.add(na);
             a++;
             count++;            
      }
                }
         
    {
              
    String[][] rowData = {
        
    { anzahl_list.get(0), anzahl_list.get(1), anzahl_list.get(2), anzahl_list.get(3), anzahl_list.get(4) },
    {  anzahl_list.get(5), anzahl_list.get(6), anzahl_list.get(7), anzahl_list.get(8), anzahl_list.get(9) }};

    String[] columnNames =  {
      "Name", "Beschreibung", "Schrank", "Tür", "Fach"
    };

    JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

    JTable table = new JTable( rowData, columnNames );
    f.add( new JScrollPane( table ));
    
    f.pack();
    f.setVisible( true );
  }

   
          
         // javax.swing.JOptionPane.showMessageDialog(null, anzahl_list);         //Anzahl_list inklusive Umbrüche wird ausgegeben

          
        } catch (Exception t) {
            System.out.println(t.getMessage());
        }




             }
         });



         getContentPane().add(BorderLayout.SOUTH, unten);
         getContentPane().add(BorderLayout.NORTH, oben);


         getContentPane().add(panel);                                           // Panel auf Frame packen

                                                                         // Komplettes Frame auf optimale Größe packen


         setVisible(true);                                                      // Mach das Fenster sichtbar

          }

}
```


----------



## HonniCilest (29. Juli 2011)

Ich verstehe immernoch nichtht, wieso du den Umweg über eine Liste gehst, die Zeilenumbrüche bringen dir dann nur noch mehr arbeit. Schau mal hier:

```
String[] columnNames =  {"Name", "Beschreibung", "Schrank", "Tür", "Fach"};
DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
String[] rsRow = {name, beschreibung, schrank, tuer, fach}; //Variablennamen schreibt man in Java nicht groß
tableModel.addRow(rwRow);
JTable table = new JTable(tableModel);
```


----------



## z-mon (29. Juli 2011)

Hallo DerBuhl,

ich habe vor langer Zeit mal ein Tutorial über JTable und JList mit einer Anbindung über eine DB geschrieben. Vielleicht hilft dir der Artikel ja bei deinem Problem weiter.

Datenaufbereitung über JTabbedPane, JList und JTable – Tutorial

Gruß
Simon


----------



## DerBuhl (30. Juli 2011)

Danke euch beiden für die Antworten, ich denke ihr habt recht und ich muss mich erstmal grundsätzlich mit JTable und JList auseinader setzen. Dannach frag ich euch dann nochmal


----------



## DerBuhl (16. August 2011)

Sorry das ich so spät wieder nachfrage aber ich war im Urlaub.
So also ich bin leider immer noch nicht schlauer . Ich habe den Code jetzt mal gekürzt und den Umbruch etc. von meinen letzen Versuchen herausgeschmissen.
Mein problem beginnt ca. in Zeile 140.

```
package zumtesten;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import javax.swing.JTable;
 
import java.io.IOError;
import java.io.IOException;
import java.sql.*;
 
import java.util.List;
import java.util.ArrayList;
 
public class FindArtikle extends JFrame {
 
 
                                                      
    private JPanel panel;                                                       
    private JButton button1;
     private JButton button2;
     private JLabel oben;
     private JLabel unten;
     private JLabel abstand;
     private JLabel abstand2;
     private JLabel abstand3;
     private JLabel name;
     private JLabel abstand4;
     private JLabel abstand5;
     private JButton schrankpl;
     private JButton suchen;
     private JLabel abstand6;
     private JLabel abstand7;
      
     public FindArtikle()                                                         // Konstruktor
 
    {
 
 
 
         super("Fenster");                                                      // Aufruf des Konstruktors der Superklasse mit übergabe eines Strings
         setSize(300, 300);                                                     // Fenster auf Grösse 300x300
         setLocation (300,300);                                                 // Position auf 300x 300
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                        // Beim schliessen des Fensters --> Programm beenden
         setLayout(new BorderLayout(6,6));                                      // Ein Layout für JFrame festlegen
 
         panel= new JPanel(new GridLayout(8,9));                                // Ein Panel erzeugen mit GridLayout
                                                                                  // Einen Button erzeugen
         button1 = new JButton("Menü");
         button2 = new JButton("Beenden");
         schrankpl = new JButton ("Schrankplan");
 
         final TextField nametf = new TextField("", 30);
 
         unten = new JLabel("Version 1.0");
         oben = new JLabel ("Lagerungssoftware");
         abstand = new JLabel ("<html><b><font size='5'>Artikel suchen</font></b></html>");
         abstand2 = new JLabel ("");
         abstand3 = new JLabel ("");
         abstand4 = new JLabel ("");
         abstand5 = new JLabel ("");
         abstand6 = new JLabel ("");
         abstand7 = new JLabel ("");
         name = new JLabel("Artikelname:");
         suchen = new JButton("Suchen");
 
         panel.add(abstand);
         panel.add(abstand6);
         panel.add(abstand7);
         panel.add(abstand3);
         panel.add(name);         
         panel.add(nametf);
         panel.add(abstand2);
         panel.add(suchen);
         panel.add(abstand4);
         panel.add(abstand5);// Button auf Panel packen
         panel.add(button1);
         panel.add(button2);
         panel.add(schrankpl);
 
         button2.addActionListener( new ActionListener() {
         public void actionPerformed( ActionEvent e ) {
         System.exit( 0 );
            }
                } );
 
         button1.addActionListener( new ActionListener() {
             public void actionPerformed (ActionEvent e){
             AppWindow AppWindow4 = new AppWindow();
             }
         });
 
         schrankpl.addActionListener( new ActionListener() {
             public void actionPerformed (ActionEvent e) {
             schrankplan schrank = new schrankplan();
             }
         });
 
 
         suchen.addActionListener( new ActionListener() {
             public void actionPerformed (ActionEvent e) {
            String Name = nametf.getText();
 
    Statement stmt; 
    ResultSet rs;   
 
          try {
 
          Class.forName("com.mysql.jdbc.Driver"); 
 
          String url = "jdbc:mysql://localhost:3306/lagerung"; 
          Connection con = DriverManager.getConnection(url, "root", "Admin"); 
 
 
 
          stmt = con.createStatement();  
 
          rs = stmt.executeQuery("Select * from Artikel where Name Like '%"+ Name +"%'");                   
          List<String> nam_list = new ArrayList<String>();
         
          while(rs.next()){                                                     
                 String Nam = rs.getString("Name");
                 nam_list.add(Nam);
 
                 String Beschrei = rs.getString("Beschreibung");
                 nam_list.add(Beschrei);
 
                 double Schran = rs.getDouble("Schrank");
                 String Schra = String.valueOf(Schran);
                 nam_list.add(Schra);
 
                 String Tue = rs.getString("Tuer");
                 nam_list.add(Tue);
 
                 String Fac = rs.getString("Fach");
                 nam_list.add(Fac);
                             }
                                                        
    {
              
    String[][] rowData = {
        
    { nam_list.get(0), nam_list.get(1), nam_list.get(2), nam_list.get(3), nam_list.get(4) },
    {  nam_list.get(5), nam_list.get(6), nam_list.get(7), nam_list.get(8), nam_list.get(9) }};
 
    String[] columnNames =  {
      "Name", "Beschreibung", "Schrank", "Tür", "Fach"
    };
 
    JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
 
    JTable table = new JTable( rowData, columnNames );
    f.add( new JScrollPane( table ));
    
    f.pack();
    f.setVisible( true );
  }
           
        } catch (Exception t) {
            System.out.println(t.getMessage());
        }
 
 
 
 
             }
         });
 
 
 
         getContentPane().add(BorderLayout.SOUTH, unten);
         getContentPane().add(BorderLayout.NORTH, oben);
 
 
         getContentPane().add(panel);                                           
 
                                                                         
 
 
         setVisible(true);                                                      
 
          }
 
}
```

also ich habe das Problem, dass es in der Datenbank redundante Einträge gibt. Die Tabelle muss also mal mehr als 5, mal weniger als 5 Inhalte aufnehmen.
Durch 
	
	
	



```
nam_list.get()
```
 bekomme ich ja nur eine Zeile ausgegeben. Hat vielleicht jemand einen Lösungsansatz für mich? Ich fürchte ich bin auf dem völlig falschen Weg .
Ich habe es auch schon versucht mit:

```
for(int i = 0; i<anzahl;i++){
String[][] rowData = {
{ nam_list.get(i)}};
}
```
das funktioniert aber leider auch nicht . Ich bin echt ratlos


----------

