JTable wird nicht angezeigt

The_Answer1985

Erfahrenes Mitglied
Hallo zusammen,

ich verzweifle gerade daran, eine JTable zu erzeugen. Ich sitz schon ne Weile davor, vllt erkenn ich deswegen den vermeintlichen Fehler nicht...evtl kann ihn ja jm. von euch entdecken :)

Und zwar folgendes:

Betroffen sind 3 Klassen.
  1. Die erste Klasse ist ein Dialog bei dem aus einer Liste Tabellen aus einer Datenbank angezeigt werden können und mit Checkbox's die gewünschten Spalten selektiert werden. Diese gibt die Werte des Benutzers weiter an eine Klasse, die für den DB-Zugriff zuständig ist.
  2. Die Klasse DBZugriff wiederrum setzt ein SQL Stmt zusammen und füllt zwei Vectoren für die Tabelle: einen für die Spaltenbezeichnungen und den zweiten für die Werte
  3. die dritte Klasse empfängt aus der Klasse DBZugriff die Tabelle und soll diese nur anzeigen. Eben das Anzeigen funktioniert nicht, anstatt der Tabelle erhalte ich eine leere Fläche
Klasse DBZugriff
Code:
    public Vector<Vector<String>> leseDB(ArrayList<String> spalten, ArrayList<String> tabellen, String suchbegriff){
        
        statement = null;
        result = null;
        
        StringBuilder select = null;
        StringBuilder from = null;
        StringBuilder where = null; 
        
        try 
        {        
                if(parent.serviceBewertung){
                    select = new StringBuilder("SELECT ");
                       for(int i = 0; i <= spalten.size(); i++){
                        
                        if(i == spalten.size() - 1){
                            select.append(spalten.get(i) + " ");
                        }
                        else if(i < spalten.size() - 1){
                            select.append(spalten.get(i) + ", ");
                        }
                       }
                    from = new StringBuilder("FROM ");
            
                    for(int n = 0; n <= tabellen.size() - 1; n++){
                        if(n == tabellen.size() - 1){
                            from.append(tabellen.get(n) + "");
                        }
                        else{
                            from.append(tabellen.get(n) + ", ");
                        }
                    }
                    where = new StringBuilder(" WHERE ");
                    where.append(suchbegriff + " AND ");
                    for (int j = 0; j <= tabellen.size() - 1; j++){
                        if(j == tabellen.size() - 1){
                            where.append(tabellen.get(j - 1) + ".Kundennummer = " + tabellen.get(j)+ ".Kundennummer");
                        }
                        else{
                            where.append(tabellen.get(j) + ".Kundennummer = " + tabellen.get(j + 1) + ".Kundennummer" + " AND ");
                        }
                        
                    }
                    
                }
                else{
            
                    select = new StringBuilder("SELECT ");
                       for(int i = 0; i <= spalten.size(); i++){
                        
                        if(i == spalten.size() - 1){
                            select.append(spalten.get(i) + " ");
                        }
                        else if(i < spalten.size() - 1){
                            select.append(spalten.get(i) + ", ");
                        }
                       }
                    from = new StringBuilder("FROM ");
                    from.append(tabellen.get(0));
                    from.append(" INNER JOIN ");
                    for(int n = 1; n <= tabellen.size() - 1; n++){
                        from.append(tabellen.get(n) + " ON (Kunde.Kundennummer = " + tabellen.get(n) + ".Kundennummer)");
                        if(n == tabellen.size() - 1){
                            from.append("");
                        }
                        else{
                            from.append(" INNER JOIN ");
                        }
                    }
                    
                    where = new StringBuilder(" WHERE ");
                    where.append(suchbegriff + ";");
                }
                System.out.println(select.toString() + from.toString() + where.toString());
                
                statement = connection.createStatement();
                result = statement.executeQuery(select.toString() + from.toString() + where.toString());

                if(result != null){
                    Vector<Vector<String>> results = new Vector<Vector<String>>();
                    
                    java.sql.ResultSetMetaData rsmd = result.getMetaData(); 
                    x = rsmd.getColumnCount();
                    
                    while(result.next()){    

                        Vector<String> detail = new Vector<String>();
                    
                        detail.add(String.valueOf(result.getInt("Kundennummer")));
                        detail.add(result.getString("Kundenname"));
                        detail.add(result.getString("Plz"));
                        detail.add(result.getString("Ort"));
                        detail.add(result.getString("EMail"));
                        results.add(detail);
                        
                    }
                    meinModel.setDataVector(results, getBezeichnungen());
                    return results;
                }
        }
        catch (SQLException ex1) 
        {
                parent.fehlerBearbeitung(ex1.getMessage());
                ex1.printStackTrace();
        }
        return null;
    }

    public javax.swing.JTable tabelleErzeugen(){
        meineTabelle = new javax.swing.JTable(meinModel);
        meineTabelle.setModel(meinModel);
        
        return meineTabelle;
    }

Die Spalten und der SQL Query sind nicht null bzw. leer.

Danke für jeden Hinweis.

Liebe Grüße
 
Hallo,

wird die Methode tabelleErzeugen überhaupt irgendwo aufgerufen?

In dem Quelltext den du gepostet hast, ist das nämlich nicht der Fall.

MFG

zEriX
 
Guten Morgen,

in einer kleinen Methode erzeuge ich eine Instanz des Dialogs, der die Tabelle anzeigen soll und übergeb ihm die Tabelle mit dem Methodenaufruf.

Ich poste mal ein bisschen Code des Dialogs:
Code:
public class mailingAbfrageDialog extends javax.swing.JFrame {
    
    public mailingAbfrageDialog(javax.swing.JTable tab1) {
        setTabelle(tab1);
        init();
        
    }

private void init(){
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Abfrage Ergebnisse");

        jTable1 = getTabelle();
        jScrollPane1.setViewportView(jTable1);

        //...
}

    public void setTabelle(javax.swing.JTable tab1){
        this.tabelle = tab1;
    }
    public javax.swing.JTable getTabelle(){
        return tabelle;
    }

Code:
public void showDialog(){
        mailingDialog myDialog = new mailingDialog(einZugriff.tabelleErzeugen());
        mailingDialog.setVisible(true);
    }

Liebe Grüße
 
Ja, ein kleines Stück weiter unten im Code.

Das komische daran ist, als ich noch aufgrund von Syntax-Fehlern im SQL Stmt SQLExceptions hatte, wurde die Tabelle erzeugt inkl. Spaltennamen, die aus der ArrayList empfangen werden.

Nur die Tabelle zeigte das Ergebnis des Querys nicht an und hat bei jeder Maus Aktion erneut eine Exception (ArrayIndexOutOfBounds) geworfen.
Diese Exception wurde aufgrund des bezeichnungsVectors geworfen.

Diesem hatte ich in einer for-Schleife die Spaltenbezeichnungen für die Tabelle aus einer ArrayList zugewiesen. Jetzt geh ich den Umweg einen neuen Vector den Inhalt aus der ArrayList zuzuweisen und diesen Vector wiederrum dem bezeichnungsVector.

Liebe Grüße

EDIT:

Ich poste mal, wie ich dem Vector die Werte aus der ArrayList zuweise, da ich dabei gestern häufige Fehlermeldung erhielt:
Code:
	public void spaltenErzeugen(ArrayList<String> bezeichnung){

		if(!(bezeichnung.size() == 0)){

			for(int i = 0; i < bezeichnung.size(); i++){
					String eineSpalte = bezeichnung.get(i);
					bezeichnungen.add(eineSpalte);
			}
		}
	}

einZugriff.setBezeichnungen(bezeichnungen);

Code:
		meinModel = new DefaultTableModel(1, x);
		meinModel.setColumnIdentifiers(getBezeichnungen());
 
Zuletzt bearbeitet:
Zurück