MySQL Abfrage in JTable speichern

didi577

Bekanntes Mitglied
Hallo,
ich habe ein kleines Tool in dem ich Fragebögen erfasse und will diese jetzt auswerten. Ich benötige jetzt einen Ratschlag wie ich die Abfrage bauen kann.
Hier ein Ausschnitt der Daten:
upload_2017-1-4_20-22-15.png
Die Spalte "land" soll in folgender JTable ausgewertet werden:
upload_2017-1-4_20-23-33.png
Die erste Zeile (Kürzel in Großbuchstaben z.B. "BB") ist der TableHeader. In der zweiten Zeile sollen die Werte der Spalte "land" aus der MySQL erscheinen (die Kürzel in kleinen Buchstaben sind hier momentan nur Platzhalter).
In der JTable soll in der Spalte "BB" also "3" stehen weil in der MySQL 3x bb erfasst wurde, in "MV" "2" etc.. Wenn ein "land" in der MySQL nicht vertreten ist soll die Spalte in der JTable leer bleiben.
Eine SQL Abfrage habe ich probiert: "SELECT land, count(land) FROM fragen (where dozent=? AND kurs=? AND ort=? AND datum=?) GROUP BY land". Die funktioniert auch in der Konsole.

Wie muss der Java Code für solch eine Abfrage aussehen? Mir feht hier leider jegliche Erfahrung.
 

didi577

Bekanntes Mitglied
für die JTable nutze ich diesen Code und dachte mir die Abfrage hiermit zu verbinden:
Java:
String [][] werteL = new String [][] {{"ka","bb","bw","sh","by","ni","nw","mv","rp","sn","st","th"}};
       String [] laender = new String [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"};
       tblLand = new JTable(new DefaultTableModel(werteL,laender));

für den String werteL benötige ich dann die Abfrage die ich dann im DefaultTableModel anstelle von "werteL" setze. Ist dieser Ansatz lohnenswert?
 

didi577

Bekanntes Mitglied
ja klar, ich habe in meiner Anwendung schon einige DB Zugriffe mit select, delete und insert

mir fehlt nur noch die Herangehensweise für den Abruf von Daten aus MySQL die ich in der oben beschriebenen Tabelle darstellen will
 

didi577

Bekanntes Mitglied
ich habe jetzt etwas rum probiert:
beim Fensterstart lade ich diese Tabelle tblLand:
Java:
Object [][] werteL = new Object [][] {{"ka","bb","bw","sh","by","ni","nw","mv","rp","sn","st","th"}};
       Object [] laender = new Object [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"};
       tblLand = new JTable();
       tblml = new DefaultTableModel(werteL,laender);
       tblLand.setModel(tblml);;
wenn ich auf einen Button klicke wird das TableModel neu geladen:
Java:
tblml = new DefaultTableModel(ladenAuswertung(),new String [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"});

die Methode startet die Abfrage und soll die abgefragten Werte in die Tabelle tblLand eintragen:
Java:
private String [][] ladenAuswertung() {
       
       Connection con = null;
       try {
           String dozent = boxDozentM.getSelectedItem().toString();
           String kurs = boxKursM.getSelectedItem().toString();
           String ort = boxOrtM.getSelectedItem().toString();
           String datum = boxDatumM.getSelectedItem().toString();
           con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
           PreparedStatement pst = con.prepareStatement("SELECT count(land) FROM fragen where dozent=? AND kurs=? AND ort=? AND datum =? ");
           pst.setString(1, dozent);
           pst.setString(2, kurs);
           pst.setString(3, ort);
           pst.setString(4, datum);
           ResultSet rs1 = pst.executeQuery();
           while (rs1.next()) {
               ka = rs1.getString(1);
               bb = rs1.getString(1);
               bw = rs1.getString(1);
               sh = rs1.getString(1);
               by = rs1.getString(1);
               ni = rs1.getString(1);
               nw = rs1.getString(1);
               mv = rs1.getString(1);
               rp = rs1.getString(1);
               sn = rs1.getString(1);
               st = rs1.getString(1);
               th = rs1.getString(1);
               
               System.out.println(rs1.getString(1));
           }
       
       }    catch (SQLException e) {
               System.out.println(e);
               e.printStackTrace();
               
           }
               
       [SIZE=5][COLOR=#ff4d4d]return ???;[/COLOR][/SIZE]
   }
welchen return Wert gebe ich hier ein? wenn ich "null" eintrage kommt kein Fehler aber es passiert auch nix...logisch.
Führt diese Abfrage überhaupt zum gewünschten Ziel?
 

Robat

Top Contributor
ka = rs1.getString(1);
bb = rs1.getString(1);
bw = rs1.getString(1);
sh = rs1.getString(1);
by = rs1.getString(1);
ni = rs1.getString(1);
nw = rs1.getString(1);
mv = rs1.getString(1);
rp = rs1.getString(1);
sn = rs1.getString(1);
st = rs1.getString(1);
th = rs1.getString(1);
Was ist das? Wo hast du die Variablen deklariert?

Du willst ein 2d - String Array zurückgeben.

So wie ich das in Erinnerung habe hat deine Tabelle nur 1 Datensatz - richtig?
Die zitierten Daten müssen alle in 1 Datensatz, oder?
Wenn dem so sei dann kannst du auch folgendes machen:

Java:
String[][] daten = new String[1][11];
for(int i = 0; i < 11; i++)
{
    daten[0][i] = rs1.getString(1);
}

Somit würdest du die Daten (welche immer die selben sein sollten?) in dein 2d Array schreiben.

Gruß
Robert
 

didi577

Bekanntes Mitglied
Moin,

danke für dein Feedback.
upload_2017-1-4_20-23-33-png.9553

ich habe 12 Spalten und möchte die Daten jeweils in den Spalten speichern. Also wenn 3 x "BB" vorhanden ist soll in der Spalte "bb" 3 stehen etc. Im ersten Thread zu diesem Thema hatte ich das beschrieben.
 

didi577

Bekanntes Mitglied
@ Robat

Was ist das? Wo hast du die Variablen deklariert?
die Variablen habe ich in der Klasse deklariert. Ich baue diese Tabelle:
Java:
Object [][] werteL = new Object [][] {{"ka","bb","bw","sh","by","ni","nw","mv","rp","sn","st","th"}};
       Object [] laender = new Object [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"};
       tblLand = new JTable();
       tblml = new DefaultTableModel(werteL,laender);tblLand.setShowGrid(false);
       tblLand.setModel(tblml);;
und nach Klick auf einen Button soll sich das TableModel aktualisieren:
Java:
tblml = new DefaultTableModel(ladenAuswertung(),new String [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"});
die Methode "ladenAuswertung()" die die Daten aktualisieren und in die Tabellenspalten setzen soll ist diese:
Java:
private String [][] ladenAuswertung() {
       
       Connection con = null;
       try {
           String dozent = boxDozentM.getSelectedItem().toString();
           String kurs = boxKursM.getSelectedItem().toString();
           String ort = boxOrtM.getSelectedItem().toString();
           String datum = boxDatumM.getSelectedItem().toString();
           con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
//           PreparedStatement pst = con.prepareStatement("select land, a1, a2, a3, a4, b1, b2, b3, c1, c1_txt, c2, c3, c4, c5, d1, d2, d3, d4_txt, d5_txt from fragen where dozent=? AND kurs=? AND ort=? AND datum=?");
           PreparedStatement pst = con.prepareStatement("SELECT count(land) FROM fragen where dozent=? AND kurs=? AND ort=? AND datum =? ");
           pst.setString(1, dozent);
           pst.setString(2, kurs);
           pst.setString(3, ort);
           pst.setString(4, datum);
           ResultSet rs1 = pst.executeQuery();
           while (rs1.next()) {
               
          
               ka = rs1.getString(1);
               bb = rs1.getString(1);
               bw = rs1.getString(1);
               sh = rs1.getString(1);
               by = rs1.getString(1);
               ni = rs1.getString(1);
               nw = rs1.getString(1);
               mv = rs1.getString(1);
               rp = rs1.getString(1);
               sn = rs1.getString(1);
               st = rs1.getString(1);
               th = rs1.getString(1);
               
               System.out.println(rs1.getString(1));
           }
       
       }    catch (SQLException e) {
               System.out.println(e);
               e.printStackTrace();
               
           }
               
       return null;
   }
die Aufzählung
Java:
   ka = rs1.getString(1);     bb = rs1.getString(1);
etc. soll die ermittelten DB Werte in die JTable setzen
 

Robat

Top Contributor
Also hab ich das richtig verstanden, dass deine Tabelle maximal einen Datensatz hat und bspw. so aussieht:

Also könnte das Beispielhaft so aussehen?
Code:
 kA  BB  BW  SH  BY  NI  NW  MV  RP  SN  ST  TH 
  0    1   4      3    0    8    2     2    3    1     4   3

Dann wäre ja die Methode aus meinem vorherigen Post ein Ansatz..

Du hast deine Methode private String[][] ladeAuswertung() die ein 2D-Array zurückgibt - was deinem Datensatz entspricht.
Wenn du 12 Spalten und 1 Zeile hast dann hat dein Array also die Dimension [1][12].

Java:
private String[][] ladeAuswertung()
{
     String[][] data = new String[1][12];

     // do some stuff

     return data;
}

Dein SQL Statement sieht mMn richtig aus (bin aber auch kein SQL Profi :D ).

Um jetzt die Daten in das Array zu bekommen gibt es verschiedene Möglichkeiten.

Du könntest dir eine locale Laufvariable erstellen die dein Index im Array darstellt.

Java:
int i = 0;
String[][] data = new String[1][12];
while(rs1.next())
{
    data[0][i] = rs1.getString(1);
    i++;
}

Oder du machst das ganze mit einer ArrayList, die du am Ende zu einem Array convertierst.
return arrayList.toArray(new String[arrayList.size()]);

Was davon die performantere / bessere Methode ist will ich nicht beurteilen.

Gruß
Robert
 

didi577

Bekanntes Mitglied
genau es sollen 12 Spalten mit einer Zeile sein...so stelle ich mir das vor:)

ich schaue mir deine Ideen heute Abendd genauer an und probiere es aus, learning by doing kann echt anstrengend sein ;)

erstmal vielen vieln Dank für deine Unterstützung

Gruß

Patrick
 

didi577

Bekanntes Mitglied
@Robat
habe es jetzt mal eingebaut
Java:
    private String [][] ladenAuswertung() {
       
       String[][] werteL = new String[1][12];
       Connection con = null;
       try {
           String dozent = boxDozentM.getSelectedItem().toString();
           String kurs = boxKursM.getSelectedItem().toString();
           String ort = boxOrtM.getSelectedItem().toString();
           String datum = boxDatumM.getSelectedItem().toString();
           con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
//           PreparedStatement pst = con.prepareStatement("select land, a1, a2, a3, a4, b1, b2, b3, c1, c1_txt, c2, c3, c4, c5, d1, d2, d3, d4_txt, d5_txt from fragen where dozent=? AND kurs=? AND ort=? AND datum=?");
           PreparedStatement pst = con.prepareStatement("SELECT count(land) FROM fragen where dozent=? AND kurs=? AND ort=? AND datum =? ");
           pst.setString(1, dozent);
           pst.setString(2, kurs);
           pst.setString(3, ort);
           pst.setString(4, datum);
           ResultSet rs1 = pst.executeQuery();
           int i =0;
           
           while (rs1.next()) {
               
               werteL[0][i] = rs1.getString(1);
               i++;
           
           }
       
       }    catch (SQLException e) {
               System.out.println(e);
               e.printStackTrace();
               
           }  


        return werteL;       
   }

es kommen keine Fehler es passiert aber auch nix, also es werden keine Daten in der Tabelle angezeigt, es kommen keine Daten raus

also irgendwo klemmt es noch
 

Robat

Top Contributor
Lass dir mal ausgeben, was in dem Array bzw in deinem ResultSet drin steht.
Kann gut sein, dass es an der SQL liegt.

Hab das mal fix mit einem simplen File nachgebastelt.
Prinzip ist aber das selbe.

Denk daran, falls du erst die Tabelle erstellst und die Daten später einfügst DefaultTableModel#fireTableDataChanged();
aufrufst.

Ergebnis sieht so aus: (bzw siehe Anhang)

Quellcode sieht so aus:

Java:
public static void main(String[] args)
{
    JFrame f = new JFrame();
    f.setLocationRelativeTo(null);
    f.setSize(500, 500);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    String[] head = { "A", "B", "C", "D", "E", "F","G", "H", "I", "J", "k", "L" };
    DefaultTableModel dtm = new DefaultTableModel(datenAuslesen(), head);
    JTable t = new JTable(dtm);
    JScrollPane s = new JScrollPane(t);
    f.add(s);

    f.setVisible(true);
}

private static String[][] datenAuslesen()
{

        String[][] daten = new String[1][12];

        try {
        FileReader fr = new FileReader(JavaForum.class.getResource("bla.txt").getFile());
        BufferedReader br = new BufferedReader(fr);

        int i = 0;

        String line = "";
        while( (line = br.readLine()) != null)
        {
            daten[0][i] = line;
            i++;
        }


    } catch (IOException ex) {
        Logger.getLogger(JavaForum.class.getName()).log(Level.SEVERE, null, ex);
    }

    return daten;
}

Gruß
Robert
 

Anhänge

  • Screenshot_8.png
    Screenshot_8.png
    3,6 KB · Aufrufe: 40

didi577

Bekanntes Mitglied
Java:
    System.out.println(rs1.getString(1));
ergibt true

ich lade bei einem Klick
Java:
tblml = new DefaultTableModel(ladenAuswertung(),new String [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"});

hier soll ich
Java:
DefaultTableModel#fireTableDataChanged();
einbauen?

wie muss das aussehen?

wenn ich meine sql in der Konsole eingebe kommt 25 raus, klar weil 25 Datensätze in der DB sind
aber ich will ja die Aufteilung dieser 25 Datensätze auf mein Array
 

didi577

Bekanntes Mitglied
@Robat habe noch etwas angepasst gemäß deinem Vorschlag
Java:
private String [][] ladenAuswertung() {
       
       String[][] werteL = new String[1][12];
       Connection con = null;
       try {
           String dozent = boxDozentM.getSelectedItem().toString();
           String kurs = boxKursM.getSelectedItem().toString();
           String ort = boxOrtM.getSelectedItem().toString();
           String datum = boxDatumM.getSelectedItem().toString();
           con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
//           PreparedStatement pst = con.prepareStatement("select land, a1, a2, a3, a4, b1, b2, b3, c1, c1_txt, c2, c3, c4, c5, d1, d2, d3, d4_txt, d5_txt from fragen where dozent=? AND kurs=? AND ort=? AND datum=?");
           PreparedStatement pst = con.prepareStatement("SELECT count(land) FROM fragen where dozent=? AND kurs=? AND ort=? AND datum =? ");
           pst.setString(1, dozent);
           pst.setString(2, kurs);
           pst.setString(3, ort);
           pst.setString(4, datum);
           ResultSet rs1 = pst.executeQuery();
           int i = 0;

           String line = "";
           
           while( (line = rs1.next()) != null) {
               
           werteL[0][i] = line;
               i++;
               
               System.out.println(rs1.getString(1));
           }
       
       }    catch (SQLException e) {
               System.out.println(e);
               e.printStackTrace();
               
           }  


        return werteL;       
   }

hier meckert er jetzt
Java:
while( (line = rs1.next()) != null)
und will "line" als boolean
 

Robat

Top Contributor
Mach die letzte Änderung bitte wieder rückgängig! Ich wollte dich damit nicht verwirren. Das war wirklich nur ein Beispiel wie es mit einem Textfile funktionieren würde.
War mein Fehler - sorry.

Den Rest schau ich mir heute Abend / morgen noch mal an. Je nach dem wie es mit der Zeit passt.
 

didi577

Bekanntes Mitglied
@ RObat
kein Problem...

habe es wieder zurück gesetzt und bekomme jetzt schon mal mit sysout ein ResultSet auf die Konsole. Es lag wie du richtig vermutet hast an der SQL Abfrage
upload_2017-1-6_18-53-12.png
im Command Line Client sieht die Abfrage so aus:
upload_2017-1-6_18-54-53.png
die Spalte count(land) muss jetzt nur noch in der richtigen Reihenfolge in die JTable:D
denn die sieht leider immer noch so aus :(:
upload_2017-1-6_18-58-56.png

hier nochmal mein Code:
1. die Tabelle wird generiert:
Java:
Object [][] werteL = new Object [][] {{"ka","bb","bw","sh","by","ni","nw","mv","rp","sn","st","th"}};
       Object [] laender = new Object [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"};
       tblLand = new JTable();
       tblmL = (new DefaultTableModel(werteL,laender));tblLand.setShowGrid(false);
       tblLand.setModel(tblmL);
dann klicke ich auf einen Button und rufe das auf:
Java:
tblmL = new DefaultTableModel(ladenAuswertung(),new Object [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"});tblLand.setShowGrid(false);
das führt dann diese Methode aus:
Java:
private Object [][] ladenAuswertung() {
       
       Object[][] werteL = new Object[1][12];
       Connection con = null;
       try {
           String dozent = boxDozentM.getSelectedItem().toString();
           String kurs = boxKursM.getSelectedItem().toString();
           String ort = boxOrtM.getSelectedItem().toString();
           String datum = boxDatumM.getSelectedItem().toString();
           con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
           PreparedStatement pst = con.prepareStatement("SELECT land,count(land) FROM fragen where dozent=? AND kurs=? AND ort=? AND datum =? GROUP BY land");
           pst.setString(1, dozent);
           pst.setString(2, kurs);
           pst.setString(3, ort);
           pst.setString(4, datum);
           ResultSet rs1 = pst.executeQuery();
           int i = 0;
           
           while (rs1.next()) {
               
               i++;

               System.out.println(rs1.getString(1));
           }
       
       }    catch (SQLException e) {
               System.out.println(e);
               e.printStackTrace();
               
           }  
        return werteL;       
   }
 

didi577

Bekanntes Mitglied
ups zu früh auf abschicken geklickt...

beim schreiben ist mir etwas aufgefallen.
ich klicke den Button und rufe das tablemodel auf...ich darf doch eigentlich nur die Methode "ladenAuswertung()" aufrufen und dort in dieser Methode nach der DB Abfrage das tablemodel neu setzen oder?

Vielen Dank schon mal für deine super Unterstützung und ein schönes Wochenende:cool:
 

Harry Kane

Top Contributor
DefaultTableModel#fireTableDataChanged() muss nicht explizit aufgrufen werden. Das DefaultTableModel feuert den event selber, wenn eine Row hinzugefügt wird..
ich klicke den Button und rufe das tablemodel auf
Den Satz verstehe ich nicht. Meinst du "ich rufe eine Methode des tablemodels auf" ?
In deiner letzten Version von ladenAuswertung wird das Object[][] ürbigens nicht mit Werten befüllt, sondern die Strings aus dem ResultSet werden nur auf de Konsole ausgegeben.
ich würde dir sehr empfehlen, den Rückgabewert von ladenAuswertung auf der Konsole ausgeben zu lassen, bevor du ihn zum Bauen des DefaultTableModels verwendest. Dann solltest du sehen, ob der Inhalt ist wie erwartet oder nicht.
 

didi577

Bekanntes Mitglied
Den Satz verstehe ich nicht. Meinst du "ich rufe eine Methode des tablemodels auf" ?
Java:
private class MailAction implements ActionListener {
       
       @Override
       public void actionPerformed(ActionEvent e) {
           // TODO Auto-generated method stub
           System.out.println("Mail");
           ladenAuswertung();
           tblmL = new DefaultTableModel(ladenAuswertung(),new Object [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"});tblLand.setShowGrid(false);
       }
   }
das tue ich aber ich glaube das ist Quatsch
 

didi577

Bekanntes Mitglied
ich muss wahrscheinlich im Button ladenAuswertung() auf dem TableModel Objekt aufrufen denn dort sollen die Werte ja reingeschrieben werden also tblmL.ladenAuswertung(); ??

ansonsten habe ich laden Auswertung(); mal wieder angepasst aber ohne Erfolg
Java:
    private Object [][] ladenAuswertung() {
       
       Object[][] werteL = new Object[1][12];
       Connection con = null;
       try {
           String dozent = boxDozentM.getSelectedItem().toString();
           String kurs = boxKursM.getSelectedItem().toString();
           String ort = boxOrtM.getSelectedItem().toString();
           String datum = boxDatumM.getSelectedItem().toString();
           con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
//           PreparedStatement pst = con.prepareStatement("select land, a1, a2, a3, a4, b1, b2, b3, c1, c1_txt, c2, c3, c4, c5, d1, d2, d3, d4_txt, d5_txt from fragen where dozent=? AND kurs=? AND ort=? AND datum=?");
           PreparedStatement pst = con.prepareStatement("SELECT land,count(land) FROM fragen where dozent=? AND kurs=? AND ort=? AND datum =? GROUP BY land");
           pst.setString(1, dozent);
           pst.setString(2, kurs);
           pst.setString(3, ort);
           pst.setString(4, datum);
           ResultSet rs1 = pst.executeQuery();

           for(int i = 0; i < 13; i++){
               werteL[0][i] = rs1.getString(1);
               
               System.out.println(rs1.getString(1));
           }
           
       }    catch (SQLException e) {
               System.out.println(e);
               e.printStackTrace();
               
           }  

        return werteL;       

   }
 

didi577

Bekanntes Mitglied
habe weiter experimentiert...
ich rufe bei Klick ladenAuswertung() auf
Java:
private class MailAction implements ActionListener {
       
       @Override
       public void actionPerformed(ActionEvent e) {
           // TODO Auto-generated method stub
           System.out.println("Mail");
           
           ladenAuswertung();

       }
   }
in ladenAuswertung(); läuft dieser Code:
Java:
private Object [][] ladenAuswertung() {
       
       Object[][] werteL = new Object[1][12];
       Connection con = null;
       try {
           String dozent = boxDozentM.getSelectedItem().toString();
           String kurs = boxKursM.getSelectedItem().toString();
           String ort = boxOrtM.getSelectedItem().toString();
           String datum = boxDatumM.getSelectedItem().toString();
           con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
           PreparedStatement pst = con.prepareStatement("SELECT land,count(land) FROM fragen where dozent=? AND kurs=? AND ort=? AND datum =? GROUP BY land");
           pst.setString(1, dozent);
           pst.setString(2, kurs);
           pst.setString(3, ort);
           pst.setString(4, datum);
           ResultSet rs1 = pst.executeQuery();
           int i = 0;
       
           while (rs1.next()) {
               
               i++;
               werteL[0][i] = rs1.getString(1);
               
             
               System.out.println(rs1.getString(1));
           }
           
       }    catch (SQLException e) {
               System.out.println(e);
               e.printStackTrace();
               
           }  

        return werteL;       

   }
auf der Konsole werden erwartete Werte ausgegeben
jetzt muss das Ergebnis in meine beim Fensterstart erstellte Tabelle rein:
Java:
Object [][] werteL = new Object [][] {{"ka","bb","bw","sh","by","ni","nw","mv","rp","sn","st","th"}};
       Object [] laender = new Object [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"};
       tblLand = new JTable();
       tblmL = (new DefaultTableModel(werteL,laender));tblLand.setShowGrid(false);
       tblLand.setModel(tblmL);
also werteL aus ladeAuswertung(); soll jetzt hier dargestellt werden
ich hoffe mein "Wunsch" oder besser Ziel kommt hier rüber? der Weg ist mir leider nur noch nicht schlüssig
 

Harry Kane

Top Contributor
ich muss wahrscheinlich im Button ladenAuswertung() auf dem TableModel Objekt aufrufen denn dort sollen die Werte ja reingeschrieben werden also tblmL.ladenAuswertung()
Ein DefaultTableModel hat keine Methode ladenAuswertung(). Die methode ladenAuswertung hat aber einen Rückgabewert, den du zum Aufbau eines DefaultTableModel verwenden kannst.
Es bringt übrigens gar nichts, die Methode ladenAuswertung() aufzurufen, ohne den Rückgabewert zu verwenden.
Offenbar sind dir eine Reihe von Konzepten (Objekte, Methoden, Rückgabewerte) nicht klar. Anders kann ich mir die Versuche in deinen letzten Beiträgen nicht erklären. Weitere Änderungen an deinem Code zwischen den einzelnen Beiträgen sehen für mich auch etwas "willkürlich" aus. Was ich z. B. überhaupt nicht verstehe, ist, warum du die Zeilen, mit denen du eine neues DefaultTableModel erstellst und der JTabel zuweist, aus der actionPerformed() der MailAction wieder entfernt hast, denn genau da gehören sie hin.
 

didi577

Bekanntes Mitglied
ja klar ich bin in Aktionismus bei einem mir noch unbekannten Thema verfallen
mein Projekt erfordert aber die Lösung dieses Problems
Die methode ladenAuswertung hat aber einen Rückgabewert, den du zum Aufbau eines DefaultTableModel verwenden kannst.
Es bringt übrigens gar nichts, die Methode ladenAuswertung() aufzurufen, ohne den Rückgabewert zu verwenden.
denn genau da gehören sie hin.
in diesen Kommentaren vermute ich die Lösung meines Problems
im ActionListener habe ich jetzt folgendes und muss nun wahrscheinlich den Rückgabewert ladenAuswertung(); unterbringen
Java:
private class MailAction implements ActionListener {
       
       public void actionPerformed(ActionEvent e) {
           // TODO Auto-generated method stub
           System.out.println("Mail");
           
           ladenAuswertung(???);
           tblmL = new DefaultTableModel(???,new Object [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"});tblLand.setShowGrid(false);
           tblLand.setModel(tblmL);
       }
       
   }
ich wäre für etwas Erklärung sehr dankbar, mir helfen auch nützliche Links zum nachlesen und Selbsstudium
 

didi577

Bekanntes Mitglied
habe es jetzt mit diesem Code geschafft ein Ergebnis zu erzeugen :D
Java:
private class MailAction implements ActionListener {
       
       public void actionPerformed(ActionEvent e) {
           // TODO Auto-generated method stub
           System.out.println("Mail");
           
           tblmL = new DefaultTableModel(ladenAuswertung(),new Object [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"});tblLand.setShowGrid(false);
           tblLand.setModel(tblmL);
       }
       
   }
in der Tabelle wird jetzt ein Ergebnis angezeigt:
upload_2017-1-8_17-55-53.png
die Zahlen stimmen aber die Werte stehen noch nicht in den richtigen Spalten.
Er fängt einfach in der ersten Spalte an und geht sie durch. Das Ergebnis muss so aussehen:
upload_2017-1-8_17-58-23.png
Die Reiuhenfolge der Spalten ist fix und soll nicht verändert werden. Die Werte sollen in die richtigen Spalten der JTable eingetragen werden.
Ich tüftel weiter und wäre für Tipps sehr dankbar;)
 

didi577

Bekanntes Mitglied
Wie kann ich das neue Table Model Object so erzeugen dass die Werte in den von mir vorgesehenen Spalten angezeigt werden? Ich denke da fehlt noch eine Verknüpfung
 

didi577

Bekanntes Mitglied
@Robat
bin etwas voran gekommen und muss die Werte jetzt nur noch in den richtigen Spalten abliefern
Die MySQL Spalte (land) kann 12 unterschiedliche Werte haben die in den 12 entsprechenden Spalten der JTable (kA BB BW etc.) landen müssen? Jetzt passiert es wilkürlich bei der ersten Saplte beginnend (siehe oben)
Kannst du mir sagen wie ich die Verbindung herstellen kann?
 

Harry Kane

Top Contributor
Pack das Ergebnis deiner Query in eine HashMap<String, Integer>
Java:
HashMap<String,Integer> map = new HashMap<>();
while (rs1.next ()) {
    String land = rs1.getString(1);
    int count = rs1.getInt(2);
    System.out.println("land: " + land+ ", count " + count);
    map.put(land,count);
}
und gebe die HashMap zurück.
In der actionPerformed gehst du durch die Spalten des TableModels, holst die die Namen der Spalten, schaust dann in der HashMap, ob es für den Namen einen Eintrag gibt, schreibst den in ein Array, und verwendest dann das Array als Zeile in deinem TableModel.
So in etwa
Java:
TableModel model = tblLand.getModel();
String[][] rowData = new String[1][model.getColumnCount()];
for(int col = 0; col < model.getColumnCount(); col++){
    String columnName = model.getColumnName(col);
    Integer value = map.get(columnName);
    if(value != null){
        rowData[1][col] = value.toString();
    }
}
tblLand.setModel(....);
 

didi577

Bekanntes Mitglied
ok vielen Dank werde ich ausprobieren und Rückmeldung geben

mich interessiert noch ob ich die Abfrage vereinfachen könnte indem ich von vornherein die Werte in der DB anders ablege ???
 

didi577

Bekanntes Mitglied
@Harry Kane
also das sysout zum Query sieht gut aus
in der actionPerformed klemmt es noch, ich habe jetzt diesen code:
Java:
private class MailAction implements ActionListener {
       
       public void actionPerformed(ActionEvent e) {

           System.out.println("Mail");
           
       
           HashMap<String,Integer> map = new HashMap<>();
           TableModel tblmL = tblLand.getModel();
           String[][] rowData = new String[1][tblmL.getColumnCount()];
           for(int col = 0; col < tblmL.getColumnCount(); col++){
               String columnName = tblmL.getColumnName(col);
               Integer value = map.get(columnName);
               if(value != null){
                   rowData[1][col] = value.toString();
             
               }
           }
           tblmL = new DefaultTableModel(rowData,new Object [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"});tblLand.setShowGrid(false);
           tblLand.setModel(tblmL);
       }
       
   }
die tblLand wird nicht mit Werten gefüllt, wo ist mein Fehler?
 

didi577

Bekanntes Mitglied
@Harry Kane
ich hatte auch vergessen das Modul ladenAuswertung(); in der ActionPerformed aufzurufen
habe jetzt folgendes Gesamtgebilde:
ladenAuswertung();:
Java:
private Object [][] ladenAuswertung() {
       
       Object[][] werteL = new Object[1][12];
       Connection con = null;
       try {
           String dozent = boxDozentM.getSelectedItem().toString();
           String kurs = boxKursM.getSelectedItem().toString();
           String ort = boxOrtM.getSelectedItem().toString();
           String datum = boxDatumM.getSelectedItem().toString();
           con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
           PreparedStatement pst = con.prepareStatement("SELECT land,count(land) FROM fragen where dozent=? AND kurs=? AND ort=? AND datum =? GROUP BY land");
           pst.setString(1, dozent);
           pst.setString(2, kurs);
           pst.setString(3, ort);
           pst.setString(4, datum);
           ResultSet rs1 = pst.executeQuery();

           HashMap<String,Integer> map = new HashMap<>();
           while (rs1.next ()) {
               String land = rs1.getString(1);
               int count = rs1.getInt(2);
               System.out.println("land: " + land+ ", count " + count);
               map.put(land.toUpperCase(),count);
           }
           
       }    catch (SQLException e) {
               System.out.println(e);
               e.printStackTrace();
               
           }  

        return werteL;

actionPerformed:
Java:
private class MailAction implements ActionListener {
       
       public void actionPerformed(ActionEvent e) {
     
           System.out.println("Mail");
       
           ladenAuswertung();
           HashMap<String,Integer> map = new HashMap<>();
           TableModel tblmL = tblLand.getModel();
           String[][] rowData = new String[1][tblmL.getColumnCount()];
           for(int col = 0; col < tblmL.getColumnCount(); col++){
               String columnName = tblmL.getColumnName(col);
               Integer value = map.get(columnName);
               if(value != null){
                   rowData[1][col] = value.toString();
             
               }
           }
           tblmL = new DefaultTableModel(rowData,new Object [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"});tblLand.setShowGrid(false);
           tblLand.setModel(tblmL);
       }
       
   }
es gibt keine Fehlermeldung aber auch noch keine Werte in der Tabelle. Kann es sein dass der Rückgabewert aus ladenAuswertung() in der actionPerformed nicht ankommt
 

Harry Kane

Top Contributor
Kann es sein dass der Rückgabewert aus ladenAuswertung() in der actionPerformed nicht ankommt
Ja, der kommt nicht an. In ladenAuswertung deklarierst du ein Object[][] werteL, welches du nicht mit Werten befüllst, aber zurückgibst, und eine HashMap<String,Integer> map, welche du mit Werten befüllst, aber nicht zurückgibst.
Ändere den Rückgabewert von ladenAuswertung von Object[][] auf HashMap<String, Integer>, und gebe map als Rückgabewert zurück.
ja klar ich bin in Aktionismus bei einem mir noch unbekannten Thema verfallen
mein Projekt erfordert aber die Lösung dieses Problems
Ist das ein Schul- oder Uni-Projekt?
 

didi577

Bekanntes Mitglied
ich erzeuge in der actionPerformed ein neues Object "map", das ist doch falsch?
Java:
    HashMap<String,Integer> map = new HashMap<>();
ich muss doch sicher auf "map" in ladenAuswertung(); zugreifen? wie am besten, denn die Variable ist ja in der actionPerformed nicht deklariert
 

didi577

Bekanntes Mitglied
ich bin Teamleiter und muss regelmäßig Fragebögen auswerten. da ich schon lange programmieren lernen wollte habe ich das zum Anlass genommen. Habe viele Bücher, Onlinekurse etc. inhaliert. Hier trifft mich aber die Praxis mit voller Wucht. Das heisst ich muss das gelesene und gesehene umsetzen. Das ist natürlich ansprucsvoll. Das war mir bei dieser Aufgabe vorher nicht wirklich bewusst. Bin aber gut voran gekommen. Die hier beschriebene Auswertung ist das letzte große offene Thema. Wenn etwas funktioniert nehme ich den Code für mich auseinander um es zu verstehen
 

Joose

Top Contributor
ich erzeuge in der actionPerformed ein neues Object "map", das ist doch falsch?
Ja das ist falsch bzw. unnötig ein neues Objekt zu erzeugen.
ich muss doch sicher auf "map" in ladenAuswertung(); zugreifen? wie am besten, denn die Variable ist ja in der actionPerformed nicht deklariert
Indem du den Rückgabewert der Methode ladenAuswertung nimmst und damit deine Variable map initialisierst.
---> HashMap<String, Integer> map = ladenAuswertung();

da ich schon lange programmieren lernen wollte habe ich das zum Anlass genommen. Habe viele Bücher, Onlinekurse etc. inhaliert. Hier trifft mich aber die Praxis mit voller Wucht. Das heisst ich muss das gelesene und gesehene umsetzen. Das ist natürlich ansprucsvoll.
Stimmt, aber auch dein Ziel bzw. Übungsprogramm dafür ist zuhoch gesteckt für den Anfang.
OOP kann man mit kleinen Konsolengprogrammen wunderbar üben und verstehen lernen, ohne sich unnötig mit Oberflächen rumzuschlagen (welche OOP vorraussetzen).
 

didi577

Bekanntes Mitglied
da beisse ich mich jetzt durch. es macht ja auch Spaß zu knoblen und zu tüfteln. Ich finde eure Unterstützung auch richtig toll

ich bekomme jetzt noch
"Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1"
Java:
              rowData[1][col] = value.toString();

hier hat er sicherlich ein Problem mit der 1 denn wenn ich 0 eingebe habe ich fast das gewünschte Ergebnis :)
 

Harry Kane

Top Contributor
ich muss doch sicher auf "map" in ladenAuswertung(); zugreifen? wie am besten, denn die Variable ist ja in der actionPerformed nicht deklariert
Diese Frage bestätigt, was ich weiter oben schon gesagt habe: dir fehlt ein grundsätzliches Verständnis davon, was Methoden machen, und wie man Methoden durch Rückgabewerte (und wahrscheinlich auch Methodenparameter, denn davon ist in deinem Code auch nichts zu sehen) miteinander "koppeln" kann. Dieses Verständnis ist aber nicht nur für Java, sondern grundsätzlich für jede Art von Programmiersprache essentiell. Für deinen Kenntnis- und Verständnisstand kann ich dir leider kein Tutorial empfehlen, da auch die Standard-Javatutorien ein Basiswissen voraussetzen, was bei dir nicht vollständig vorhanden zu sein scheint.
hier hat er sicherlich ein Problem mit der 1 denn wenn ich 0 eingebe habe ich fast das gewünschte Ergebnis
Ja, statt der 1 muss eine 0 rein. Bei einem Array der Länge 1 ist 0 halt der größt- (und einzig) mögliche Index.
 

didi577

Bekanntes Mitglied
alles richtig was ihr schreibt. ich bin selbstkritisch genug um mein Wissen einzuschätzen. habe in den letzten Wochen das Lernen aus den Augen verloren und mein Projekt fokussiert. werde wieder etwas umschwenken.
bin euch für eure Geduld und Hilfe sehr dankbar:rolleyes:
 

Harry Kane

Top Contributor
habe in den letzten Wochen das Lernen aus den Augen verloren und mein Projekt fokussiert
Das eine (lernen) und das andere (Projekt) sollten sich nicht nur nicht ausschließen, sondern immer Hand in Hand gehen.
Tuts und (noch schlimmer) Videos bringen meiner Meinung nach gar nix, wenn man das Gesehene/gelesene nicht direkt in die Tat umsetzt. Man pfeift sich die ganzen Contents doch gerade eben deshalb rein, weil man ein konkretes Problem hat.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D MySQL Abfrage. keine Ahnung Java Basics - Anfänger-Themen 5
W Endlosscshleife bei MySQL Abfrage Java Basics - Anfänger-Themen 5
C No suitable driver found for jdbc:odbc:mysql Java Basics - Anfänger-Themen 8
E Mysql Update wenn es nicht existiert insert Java Basics - Anfänger-Themen 14
Dimax In Java File (nicht in Java Projekt) mysql Driver importieren Java Basics - Anfänger-Themen 3
H Verbindungsprobleme BluJ und MySQL Java Basics - Anfänger-Themen 1
R Java mit MySQL - Verbindungsprobleme Java Basics - Anfänger-Themen 1
B Arquillian installieren - Maven, WildFly, MYSQL Java Basics - Anfänger-Themen 1
M Java Mysql ausführbare datei Java Basics - Anfänger-Themen 7
B MySQL (jdbc) -> connection liefert NULL Java Basics - Anfänger-Themen 3
J Java Verbindung mit mysql Datenbank Java Basics - Anfänger-Themen 3
J MySQL Datumsabfrage über ResultSet in Java-Servlet Java Basics - Anfänger-Themen 4
Dimax Programme ,als Text in MySql speichern Java Basics - Anfänger-Themen 7
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15
R Input/Output Verbindung mit mySql-Datenbank Java Basics - Anfänger-Themen 9
Q-bert MYSQL-Eintrag Java Basics - Anfänger-Themen 2
J Sonderzeichenproblem bei Datenabfrage in MySQL Java Basics - Anfänger-Themen 6
F Java MySQL Java Basics - Anfänger-Themen 3
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
D zu viele MySQL Connections Java Basics - Anfänger-Themen 18
D NPE beim laden von Daten aus MySQL Java Basics - Anfänger-Themen 9
D Eine MySQL Verbindung in mehreren Klassen Java Basics - Anfänger-Themen 8
D JTable Zeile wird nicht in MySQL gelöscht Java Basics - Anfänger-Themen 16
D Datum aus Swing in MySQL DB speichern Java Basics - Anfänger-Themen 22
B MySQL starten / stoppen -> Stoppen erzeugt neuen Prozess Java Basics - Anfänger-Themen 0
B MySQL Path bekommen Java Basics - Anfänger-Themen 40
P Brauche Hilfe bei ResultSet mit MySQL Java Basics - Anfänger-Themen 6
H JAva und MySQL Java Basics - Anfänger-Themen 1
S Best Practice MVC und große Datenmengen aus einer mySQL - Datenbank Java Basics - Anfänger-Themen 24
U Glassfish mit MySQL verbinden Java Basics - Anfänger-Themen 1
N Erste Schritte MySQL Tabelle in JList darstellen Java Basics - Anfänger-Themen 1
A Erste Schritte Verbindung zu MySQL Datenbank herstellen Java Basics - Anfänger-Themen 7
M Mysql "live" Ansicht Java Basics - Anfänger-Themen 10
W MySQL PreparedStatement query Problem Java Basics - Anfänger-Themen 10
K Classpath Mysql EclipseFehler? Java Basics - Anfänger-Themen 12
M Aktuelles Datum in MySQL speichern Java Basics - Anfänger-Themen 11
V Umlaute in mysql, antscript, powershell utf-8 Java Basics - Anfänger-Themen 7
H mysql brauche hilfe, wer kann eine (längere) aufgabe für mich erledigen Java Basics - Anfänger-Themen 2
S in MySQL Daten Bank speichern Java Basics - Anfänger-Themen 8
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
T MySQL - Java Organisationsfrage Java Basics - Anfänger-Themen 4
S ArrayList in mysql Datenbank speichern Java Basics - Anfänger-Themen 6
B Mit Java-Programm Daten aus MySQL-Datenbank auslesen, lokal und nicht lokal. Java Basics - Anfänger-Themen 10
D Mysql ob feld existiert Java Basics - Anfänger-Themen 2
D Mysql schauen Name bereits existiert Java Basics - Anfänger-Themen 7
X MySQL - Query Java Basics - Anfänger-Themen 3
J JAVA zu unsicher für MYSQL? Java Basics - Anfänger-Themen 4
S JDBC MySQL Connector - Element mit ' eintragen? Java Basics - Anfänger-Themen 4
F Verbindung zu MySql Datenbank Java Basics - Anfänger-Themen 4
K In MySQL Select Variablen aus Java Programm benutzen Java Basics - Anfänger-Themen 8
N Java dateFormat und Mysql DateTime Java Basics - Anfänger-Themen 2
B Java MySQL Query ausgeben Java Basics - Anfänger-Themen 4
J Java JDBC MySQL Query Java Basics - Anfänger-Themen 6
S mysql-connector-java-*.jar, MySql ResultSet - Alle ROWs ausgeben? Java Basics - Anfänger-Themen 3
S Datentypen EclipseLink, Datumsformat für MySQL Java Basics - Anfänger-Themen 9
S Resultset Closed (Mysql) Java Basics - Anfänger-Themen 5
K MySQL, Classpath, Java, MAC OSX Java Basics - Anfänger-Themen 3
O HashMap<> in MySQL database speichern Java Basics - Anfänger-Themen 3
D Mysql Connection Close? Java Basics - Anfänger-Themen 14
M Java - MySQL (Eclipse Java EE Web Developers) Java Basics - Anfänger-Themen 4
D Frage MySQL Columnheader Java Basics - Anfänger-Themen 2
D Java mit Mysql Datenbank angebunden Java Basics - Anfänger-Themen 5
I Null - Wert bei Date (Mysql) Java Basics - Anfänger-Themen 2
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
P Applet und MySQL-Problem Java Basics - Anfänger-Themen 20
P Applet, Daten IO, MySql Java Basics - Anfänger-Themen 2
T MySQL-Dienst starten und stoppen aus Netbeans Java Basics - Anfänger-Themen 3
A Java und MySQL!!! Java Basics - Anfänger-Themen 3
Kasoki Java und MySQL ? Java Basics - Anfänger-Themen 4
S CSV-Datei einlesen und in MySql schreiben Java Basics - Anfänger-Themen 3
M mysql-connector-java-5.1.7-bin. jar in die umgebungsvariable installieren Java Basics - Anfänger-Themen 14
A Frage zu java und MySQL Java Basics - Anfänger-Themen 3
J MySQL Timestamp "lesbarer" gestalten Java Basics - Anfänger-Themen 6
J Fehler bei MySql Anbindung mit JDBC Java Basics - Anfänger-Themen 4
W MySQL Driver als Resource laden Java Basics - Anfänger-Themen 5
M 5 MySql Tabellen in JTable - variable TableHeader? Java Basics - Anfänger-Themen 2
K Verbindung zu MySQL Java Basics - Anfänger-Themen 4
G wie erfragt man die letzte ID in einer MySQL Datenbank ab? Java Basics - Anfänger-Themen 3
S MySQL - connection Java Basics - Anfänger-Themen 8
S Zyklisches abspeichern von Daten aus einr MySql Datenbank Java Basics - Anfänger-Themen 9
B Client - Server Verbindung über sockets mysql DB ansprechen? Java Basics - Anfänger-Themen 6
G simple suche in java - mysql Java Basics - Anfänger-Themen 10
G Java und mySQL Hilfethread Java Basics - Anfänger-Themen 12
W Java.mysql.date in GregorianCalender konvertieren Java Basics - Anfänger-Themen 2
W Aus Textfeld ein "MySQL Date" auslesen Java Basics - Anfänger-Themen 2
N Problem mit MySql und Java Java Basics - Anfänger-Themen 12
P mySQL Datenbanktreiber nutzen Java Basics - Anfänger-Themen 2
J Statement an MySQL Datenbank schicken Java Basics - Anfänger-Themen 4
S Tabelsorter von SUN, wie muss die MysQL Anbindung realisiert Java Basics - Anfänger-Themen 11
J Zugriff auf eine Mysql-DB unter Linux Java Basics - Anfänger-Themen 6
G Mysql escape // html untauglich machen Java Basics - Anfänger-Themen 3
X Java & MySQL Java Basics - Anfänger-Themen 7
D Datenbankprogrammierung mit MYSQL. Java Basics - Anfänger-Themen 7
F Daten in MySQL Tabelle schreiben Java Basics - Anfänger-Themen 9
P wie erzeuge ich ein java date und lade in die mysql datebank Java Basics - Anfänger-Themen 5
M JSP --> Verbindung zur MySQL Datenbank geht nicht ! HILFF Java Basics - Anfänger-Themen 7
G POI und MySQL Java Basics - Anfänger-Themen 2
G in eine Tabelle mit mySQL eine Zeile hinzufügen Java Basics - Anfänger-Themen 17
G MySQL Tutorial Java Basics - Anfänger-Themen 2
X 1 MySQL-Verbindung und viele Threads Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben