# JTable aktualisieren



## BigMac (25. Sep 2012)

Ich weiß das thema wurde oft behandelt aber ich habe mit einer 6Stündigen suche in Google und diesem Forum keine Antwort gefunden.

Ich habe eine Tabelle mit daten aus einer MySQL DB. Dazu 3 Buttons  zum Speichern, Verändern und Suchen von Adressen in der Datenbank.
Wenn ich jetzt über die Tabelle oder Sufu eine Adresse aussuche und verändere soll die Veränderung in der JTable angezeigt werden. Ich habe es mit .repaint() .revalidate() fireTableDataChanged(oder wie auch immer)

Hier der Code:

```
package adressbuch;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;


public class AdressBuch extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6950577656155165307L;
	private JFrame frmAdressbuch;
	private JTextField nameField;
	private JTextField vnameField;
	private JTextField knrField;
	private JTextField strField;
	private JTextField nrField;
	private JTextField plzField;
	private JTextField stdField;
	private JTextField telField;
	private JTextField mailField;
	private JTable table;
	private static Statement stmt;
	static String sp;
	static String ae;
	static String su;
	static String sql;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
//		EventQueue.invokeLater(new Runnable() {
//			public void run() {
//				try {
//					AdressBuch window = new AdressBuch();
//					window.frmAdressbuch.setVisible(true);
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//			}
//		});
		String user = "root";
		String pw = "";
		String url = "jdbc:mysql://localhost/adressen";


		Class.forName("com.mysql.jdbc.Driver");		
		
		Connection  con = DriverManager.getConnection(url,user,pw);

		stmt = con.createStatement();

		
		AdressBuch window = new AdressBuch();
		window.frmAdressbuch.setVisible(true);
		

		System.out.println("Gui läuft");
	}


	/**
	 * Initialize the contents of the frame.
	 * @ 
	 */
	public  AdressBuch( ) {
		
		frmAdressbuch = new JFrame();
		frmAdressbuch.setTitle("Adressbuch");
		frmAdressbuch.setBounds(100, 100, 565, 600);
		frmAdressbuch.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmAdressbuch.getContentPane().setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Name");
		lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel.setBounds(10, 20, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel);
		
		JLabel lblNewLabel_1 = new JLabel("Vorname");
		lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_1.setBounds(210, 20, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_1);
		
		JLabel lblNewLabel_2 = new JLabel("Kundennr.");
		lblNewLabel_2.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_2.setBounds(10, 60, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_2);
		
		JLabel lblNewLabel_3 = new JLabel("Strasse");
		lblNewLabel_3.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_3.setBounds(10, 100, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_3);
		
		JLabel lblNewLabel_4 = new JLabel("Nr.");
		lblNewLabel_4.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_4.setBounds(210, 100, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_4);
		
		JLabel lblNewLabel_5 = new JLabel("PLZ");
		lblNewLabel_5.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_5.setBounds(10, 140, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_5);
		
		JLabel lblNewLabel_6 = new JLabel("Stadt");
		lblNewLabel_6.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_6.setBounds(210, 140, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_6);
		
		JLabel lblNewLabel_7 = new JLabel("Telefon");
		lblNewLabel_7.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_7.setBounds(10, 180, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_7);
		
		JLabel lblNewLabel_8 = new JLabel("E-Mail");
		lblNewLabel_8.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_8.setBounds(210, 180, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_8);
		
		nameField = new JTextField();
		nameField.setBounds(90, 20, 100, 20);
		frmAdressbuch.getContentPane().add(nameField);
		nameField.setColumns(10);
		
		vnameField = new JTextField();
		vnameField.setBounds(290, 20, 100, 20);
		frmAdressbuch.getContentPane().add(vnameField);
		vnameField.setColumns(10);
		
		knrField = new JTextField();
		knrField.setBounds(90, 60, 100, 20);
		frmAdressbuch.getContentPane().add(knrField);
		knrField.setColumns(10);
		
		strField = new JTextField();
		strField.setBounds(90, 100, 100, 20);
		frmAdressbuch.getContentPane().add(strField);
		strField.setColumns(10);
		
		nrField = new JTextField();
		nrField.setBounds(290, 100, 40, 20);
		frmAdressbuch.getContentPane().add(nrField);
		nrField.setColumns(10);
		
		plzField = new JTextField();
		plzField.setBounds(90, 140, 100, 20);
		frmAdressbuch.getContentPane().add(plzField);
		plzField.setColumns(10);
		
		stdField = new JTextField();
		stdField.setBounds(290, 140, 100, 20);
		frmAdressbuch.getContentPane().add(stdField);
		stdField.setColumns(10);
		
		telField = new JTextField();
		telField.setBounds(90, 180, 100, 20);
		frmAdressbuch.getContentPane().add(telField);
		telField.setColumns(10);
		
		mailField = new JTextField();
		mailField.setBounds(290, 180, 100, 20);
		frmAdressbuch.getContentPane().add(mailField);
		mailField.setColumns(10);
		
		JSeparator separator = new JSeparator();
		separator.setBounds(10, 220, 530, 20);
		frmAdressbuch.getContentPane().add(separator);
		
		JButton btnSpeichern = new JButton("Speichern");
		btnSpeichern.setBounds(445, 40, 95, 20);
		btnSpeichern.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				sp = "INSERT INTO adressen (knr,name,vname,str,nr,plz,std,tel,mail) VALUES ('"	       
	        + knrField.getText() 
	        + "','"  
	        + nameField.getText() 
	        + "','" 
	        + vnameField.getText() 
	        + "','" 
	        + strField.getText()
	        + "','" 
	        + nrField.getText()
	        + "','" 
	    	+ plzField.getText()
	    	+ "','" 
	        + stdField.getText()
	        + "','" 
	        + telField.getText()
	        + "','" 
	        + mailField.getText()
	        + "')"; 
				System.out.println(""+sp);
				try {
					int rs = stmt.executeUpdate(sp);
					
					System.out.println(""+rs);
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}				
			}
		});
		frmAdressbuch.getContentPane().add(btnSpeichern);
		
		JButton btnAendern = new JButton("\u00C4ndern");
		btnAendern.setBounds(445, 100, 95, 20);
		btnAendern.addActionListener(new ActionListener() {



			@Override
			public void actionPerformed(ActionEvent e) {

				ae = "UPDATE adressen SET name ='"	        
	        + nameField.getText() 
	        + "', vname ='" 
	        + vnameField.getText() 
	        + "', str ='" 
	        + strField.getText()
	        + "', nr ='" 
	        + nrField.getText()
	        + "', plz ='" 
	    	+ plzField.getText()
	    	+ "', std ='" 
	        + stdField.getText()
	        + "', tel ='" 
	        + telField.getText()
	        + "', mail ='" 
	        + mailField.getText()
	        + "' WHERE knr ='"
	        + knrField.getText()
	        + "';";
			
				
	         
				System.out.println(""+ae);
				try {
					int rs = stmt.executeUpdate(ae);
					
					System.out.println(""+rs);
					
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}				
			}			
			
		});
		frmAdressbuch.getContentPane().add(btnAendern);		
		
		
		JButton btnSuchen = new JButton("Suchen");
		btnSuchen.setBounds(445, 160, 95, 20);
		btnSuchen.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				su = "SELECT*FROM adressen WHERE knr='"	       
	        + knrField.getText() 
	        + "';";				
	        
				System.out.println(""+su);
				try {
					ResultSet rs = stmt.executeQuery(su);
					
					System.out.println(""+rs);
					
					while (rs.next()){
						String n = rs.getString(2);
						n= rs.getString("name");
						nameField.setText(n);
						
						String vn = rs.getString(3);
						vn= rs.getString("vname");
						vnameField.setText(vn);
						
						String st = rs.getString(4);
						st= rs.getString("str");
						strField.setText(st);
						
						String nr = rs.getString(5);
						nr= rs.getString("nr");
						nrField.setText(nr);
						
						String pl = rs.getString(6);
						pl= rs.getString("plz");
						plzField.setText(pl);
						
						String sd = rs.getString(7);
						sd= rs.getString("std");
						stdField.setText(sd);
						
						String te = rs.getString(8);
						te= rs.getString("tel");
						telField.setText(te);
						
						String ma = rs.getString(9);
						ma= rs.getString("mail");
						mailField.setText(ma);
						
					}
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}				
			}
		});
		
		frmAdressbuch.getContentPane().add(btnSuchen);		
			// Tabelle
			Vector<String> columnNames = new Vector<String>();
	        Vector<Vector> data = new Vector<Vector>();
	        String sql = "SELECT * FROM adressen";

	        try {	        	
				ResultSet as = stmt.executeQuery(sql);	        	
				ResultSetMetaData md = as.getMetaData();
	        	
				int columns = md.getColumnCount();
				for (int i = 2; i <= columns; i++){
					columnNames.addElement(md.getColumnName(i));
				}
				while (as.next()){
					Vector<Object> row = new Vector<Object>(columns);
	                
	                for (int i = 2; i <= columns; i++) {
	                    row.addElement( as.getObject(i) );
	                }
	                data.addElement(row);
	                
				}
			} catch (SQLException e1) {
				
				e1.printStackTrace();
			}
	        
	        table = new JTable(data, columnNames);
	        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	        table.setPreferredScrollableViewportSize(new Dimension(800,300));
	        table.setPreferredSize(new Dimension(800,300));
	        table.setSize(new Dimension(800,300));	        			
	        JScrollPane scrollPane =  new JScrollPane();
	        scrollPane.setBounds(10, 250, 530, 300);	        
	        scrollPane.getViewport().add(table);
	        
	        table.addMouseListener(new MouseAdapter() {
	        	
	        	@Override
	        	public void mouseClicked(MouseEvent e) {	        		
	        		
	        		int row = table.getSelectedRow();
	        		
	        		Object knr =table.getModel().getValueAt(row, 0);
	        		String a =knr.toString();
	        		knrField.setText(a);
	        		
	        		Object name =table.getModel().getValueAt(row, 1);
	        		String b =name.toString();
	        		nameField.setText(b);
	        		
	        		Object vname =table.getModel().getValueAt(row, 2);
	        		String c =vname.toString();
	        		vnameField.setText(c);
	        		
	        		Object str =table.getModel().getValueAt(row, 3);
	        		String d =str.toString();
	        		strField.setText(d);
	        		
	        		Object nr =table.getModel().getValueAt(row, 4);
	        		String t =nr.toString();
	        		nrField.setText(t);
	        		
	        		Object plz =table.getModel().getValueAt(row, 5);
	        		String f =plz.toString();
	        		plzField.setText(f);
	        		
	        		Object std =table.getModel().getValueAt(row, 6);
	        		String g =std.toString();
	        		stdField.setText(g);
	        		
	        		Object tel =table.getModel().getValueAt(row, 7);
	        		String h =tel.toString();
	        		telField.setText(h);
	        		
	        		Object mail =table.getModel().getValueAt(row, 8);
	        		String i =mail.toString();
	        		mailField.setText(i);
	        		
	            }        	
			});	        
	        frmAdressbuch.getContentPane().add(scrollPane);
	        
	        
	}


	   		
}
```
mfg
Mac


----------



## SlaterB (25. Sep 2012)

geht es um btnSuchen?
von Zeile 285 bis 334 im zugehörigen ActionListener wird an keiner einzigen Stelle irgendwie versucht, mit der JTable irgendwas zu machen?!
was hast du denn etwa unter fireTableDataChanged() an Vorstellungen? auch nirgendwo im Quellcode..

ein Weg wäre, sämtliche Daten zu eine neuen TableModel zusammenzufügen und das in der JTable zu setzen

etwa
Transfer a ResultSet to a JTable - Real's Java How-to


----------



## BigMac (25. Sep 2012)

danke für die schnelle antwort.
Es geht um den btnAendern. Ich weiß nicht was ich mit ihm anstellen soll, dass er die Tabelle aktualisiert.


----------



## SlaterB (25. Sep 2012)

mein vorheriges Posting enthielt die vollständige Antwort,
du zwingst mich entweder dies hier rein zu wiederholen/ darauf hinzuweisen oder für immer zu schweigen..

immer überlegen was das Thema ist, was die nächste Antwort sein soll, ob alle Fragen, alle Hinweise angemessen berücksichtigt sind usw.


----------



## BigMac (25. Sep 2012)

```
Vector<String> columnNames = new Vector<String>();
	        Vector<Vector> data = new Vector<Vector>();
	        String sql = "SELECT * FROM adressen";

	        try {	        	
				ResultSet as = stmt.executeQuery(sql);	        	
				ResultSetMetaData md = as.getMetaData();
	        	
				int columns = md.getColumnCount();
				for (int i = 2; i <= columns; i++){
					columnNames.addElement(md.getColumnName(i));
				}
				while (as.next()){
					Vector<Object> row = new Vector<Object>(columns);
	                
	                for (int i = 2; i <= columns; i++) {
	                    row.addElement( as.getObject(i) );
	                }
	                data.addElement(row);
	                
				}
			} catch (SQLException e1) {
				
				e1.printStackTrace();
			}
```

ist ungefähr das gleiche wie das was du gepostet hast. 
Die Daten sind bereits in der Tabelle ich will nur die daten aktualisieren.

Ich glaub (wenn das überhaupt möglich ist) die einfachste Lösung wäre, die querry der tabelle

```
ResultSet as = stmt.executeQuery(sql);	        	
				ResultSetMetaData md = as.getMetaData();
```
alle paar milisekunden neu ausführen zu lassen.


----------



## SlaterB (25. Sep 2012)

auch wenn ich damit schon wieder meckern muss:
ist aktuell eine Frage offen?

für den Punkt 'alle paar milisekunden neu ausführen' ist bisher keine Grundlage vorhanden/ kein Thema gewesen, jedenfalls nicht mir bewußt,
geht es dir um ständiges Live-Bild des DB-Zustandes? ziemlich ungewöhnlich und aufwendig, nicht zu empfehlen


----------



## BigMac (25. Sep 2012)

> ein Weg wäre, sämtliche Daten zu eine neuen TableModel zusammenzufügen und das in der JTable zu setzen



Ich will die Daten nicht einfügen, denn das hab ich schon. Ic will das die veränderungen in der Datenbank auf dem MySQL Server, in der Tabelle angezeigt werden ohne das Programm neu zu starten.


----------



## bERt0r (25. Sep 2012)

Dann musst du die Daten aktualisieren. Von selber kommen die nicht von der Datenbank in die JTable. Generell schreibt man so einen DB Code nicht in die ActionListener sondern legt entweder gleich eine eigene Klasse an, zumindest aber eine eigene Funktion pro Abfrage.


----------



## Camino (25. Sep 2012)

BigMac hat gesagt.:


> Ich will die Daten nicht einfügen, denn das hab ich schon. Ic will das die veränderungen in der Datenbank auf dem MySQL Server, in der Tabelle angezeigt werden ohne das Programm neu zu starten.



Und genau das macht man üblicherweise über ein TableModel, d.h. du holst dir die Daten aus der DB in das Model und das Model zeigt diese Daten dann in der JTable an. Wenn du Daten ändern möchtest, änderst du die im TableModel, welches die Änderungen an die DB schickt und auch die JTable aktualisiert.

Wenn du dein Programm noch erweitern möchtest, würde ich dir raten, nicht alles in eine Klasse zu stecken, sondern aufzuteilen (MVC). Am besten auch eine eigene Klasse, welche die Adressdaten darstellt.


----------



## SlaterB (25. Sep 2012)

BigMac hat gesagt.:


> Ich will die Daten nicht einfügen, denn das hab ich schon. Ic will das die veränderungen in der Datenbank auf dem MySQL Server, in der Tabelle angezeigt werden ohne das Programm neu zu starten.



genau das geht dadurch, die Daten aus der DB zu laden, in einem neuen TableModel zusammenzufügen und das in der JTable zu setzen,

ich kann leider nicht weiter erklären inwiefern das NICHT 'Daten in die DB einfügen ist', denn das entbehrt jeder Grundlage, siehe auch den Code,
einfach nur Daten anzeigen, siehe Code

(sorry wenn auch dieses Postings nach Gemecker aussieht, du musst die Serie durchstehen  )


----------



## BigMac (25. Sep 2012)

Camino hat gesagt.:


> Und genau das macht man üblicherweise über ein TableModel, d.h. du holst dir die Daten aus der DB in das Model und das Model zeigt diese Daten dann in der JTable an. Wenn du Daten ändern möchtest, änderst du die im TableModel, welches die Änderungen an die DB schickt und auch die JTable aktualisiert.



Danke. Jetzt komm ich der Sache immer näher. 
Ich ändere die Daten ja nicht in der Tabelle sondern in der Datenbank.
D.h. die Tabelle muss nach jeder änderung neu generiert werden.

Das ist mein erstes Programm, deswegen ist er auch so klumpig.  
Ich arbeite schon seit 2 Wochen daran (ic bring mir java selbst bei).


----------



## Camino (25. Sep 2012)

BigMac hat gesagt.:


> D.h. die Tabelle muss nach jeder änderung neu generiert werden.



Nein. Du erstellst die Tabelle nur einmal. Alle Änderungen daran laufen dann über das TableModel. Die Tabelle wird dann bei Änderungen der Daten einfach nur aktualisiert.


----------



## BigMac (25. Sep 2012)

```
Vector<String> columnNames = new Vector<String>();
	        Vector<Vector> data = new Vector<Vector>();
	        String sql = "SELECT * FROM adressen";

	        try {	        	
				ResultSet as = stmt.executeQuery(sql);	        	
				ResultSetMetaData md = as.getMetaData();

	        	
				int columns = md.getColumnCount();
				for (int i = 2; i <= columns; i++){
					columnNames.addElement(md.getColumnName(i));
				}
				while (as.next()){
					Vector<Object> row = new Vector<Object>(columns);
	                
	                for (int i = 2; i <= columns; i++) {
	                    row.addElement( as.getObject(i) );
	                }
	                data.addElement(row);
	                
				}
			} catch (SQLException e1) {
				
				e1.printStackTrace();
			}
	        
	        table = new JTable(data, columnNames);
	        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	        table.setPreferredScrollableViewportSize(new Dimension(800,300));
	        table.setPreferredSize(new Dimension(800,300));
	        table.setSize(new Dimension(800,300));	        			
	        JScrollPane scrollPane =  new JScrollPane();
	        scrollPane.setBounds(10, 250, 530, 300);	        
	        scrollPane.getViewport().add(table);
```

ich dachte damit wäre es getan. Die daten werden angezeigt, aber nicht verändert. Muss ich zusätzlich dazu ein Table model erstellen( new DefaultTableModel)?


----------



## SlaterB (25. Sep 2012)

im Listener, genau zu einem Zeitpunkt X, musst du die aktuellen Daten laden, ein neues Model zusammenstellen, und in der JTable setzen


----------



## Camino (25. Sep 2012)

Es gibt halt mehrere Möglichkeiten, die Daten in die Tabelle zu bringen. Entweder du erstellst dir immer wieder ein neues TableModel und übergibst das der Tabelle mit setModel, oder du hast eine eigene Klasse als TableModel, dann brauchst du immer nur 1 JTable und 1 TableModel und änderst die Daten einfach nur im Model.

Schau mal hier, da ist es erklärt:
http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/7035-jtable-teil-2-kommen-daten-tabelle.html


----------



## BigMac (25. Sep 2012)

sry dass ich nerv, aber was meinst du mit zum zeitpunkt x und in der tabelle setzen?
soll ich die tabelle im ActionListener von dem Button erstellen?


----------



## SlaterB (25. Sep 2012)

wenn du im Listener eine neue Tabelle erstellen solltest, hätte ich das doch geschrieben oder?
ist ein Satz wie 
"im Listener, genau zu einem Zeitpunkt X, musst du die aktuellen Daten laden, ein neues Model zusammenstellen, und in der JTable setzen"
bzw. in den vorherigen Varianten nicht in deutscher Sprache relativ eindeutig verständlich?

da kann man doch meiner Ansicht nach herauslesen, ob das vorhandene Model verändert oder ein neues Model erstellt werden soll
(grundsätzlich geht durchaus beides, eins davon hier vorgeschlagen),
da kann man doch meiner Ansicht nach herauslesen, ob die vorhandene Table verändert oder eine neue Table erstellt werden soll
(neue Table reichlich ungünstige, keine echte Option)

letzlich kannst du auch beides einfach mal ausprobieren, recht schnell Erkenntnisse gewinnen, was geht


----------



## BigMac (25. Sep 2012)

Das funktioniert alles nicht
hier der code, wo hab ich fehler gemacht

```
package adressbuch;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;


public class AdressBuch extends JFrame implements TableModelListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6950577656155165307L;
	private JFrame frmAdressbuch;
	private JTextField nameField;
	private JTextField vnameField;
	private JTextField knrField;
	private JTextField strField;
	private JTextField nrField;
	private JTextField plzField;
	private JTextField stdField;
	private JTextField telField;
	private JTextField mailField;
	private JTable table;
	private static  Statement stmt;
	static String sp;
	static String ae;
	static String su;
	static String sql;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
//		EventQueue.invokeLater(new Runnable() {
//			public void run() {
//				try {
//					AdressBuch window = new AdressBuch();
//					window.frmAdressbuch.setVisible(true);
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//			}
//		});
		String user = "root";
		String pw = "";
		String url = "jdbc:mysql://localhost/adressen";


		Class.forName("com.mysql.jdbc.Driver");		
		
		Connection  con = DriverManager.getConnection(url,user,pw);

		stmt = con.createStatement();

		
		AdressBuch window = new AdressBuch();
		window.frmAdressbuch.setVisible(true);
		

		System.out.println("Gui läuft");
	}


	/**
	 * Initialize the contents of the frame.
	 * @ 
	 */
	public  AdressBuch( ) {
		
		frmAdressbuch = new JFrame();
		frmAdressbuch.setTitle("Adressbuch");
		frmAdressbuch.setBounds(100, 100, 565, 600);
		frmAdressbuch.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmAdressbuch.getContentPane().setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Name");
		lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel.setBounds(10, 20, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel);
		
		JLabel lblNewLabel_1 = new JLabel("Vorname");
		lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_1.setBounds(210, 20, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_1);
		
		JLabel lblNewLabel_2 = new JLabel("Kundennr.");
		lblNewLabel_2.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_2.setBounds(10, 60, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_2);
		
		JLabel lblNewLabel_3 = new JLabel("Strasse");
		lblNewLabel_3.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_3.setBounds(10, 100, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_3);
		
		JLabel lblNewLabel_4 = new JLabel("Nr.");
		lblNewLabel_4.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_4.setBounds(210, 100, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_4);
		
		JLabel lblNewLabel_5 = new JLabel("PLZ");
		lblNewLabel_5.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_5.setBounds(10, 140, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_5);
		
		JLabel lblNewLabel_6 = new JLabel("Stadt");
		lblNewLabel_6.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_6.setBounds(210, 140, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_6);
		
		JLabel lblNewLabel_7 = new JLabel("Telefon");
		lblNewLabel_7.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_7.setBounds(10, 180, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_7);
		
		JLabel lblNewLabel_8 = new JLabel("E-Mail");
		lblNewLabel_8.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_8.setBounds(210, 180, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_8);
		
		nameField = new JTextField();
		nameField.setBounds(90, 20, 100, 20);
		frmAdressbuch.getContentPane().add(nameField);
		nameField.setColumns(10);
		
		vnameField = new JTextField();
		vnameField.setBounds(290, 20, 100, 20);
		frmAdressbuch.getContentPane().add(vnameField);
		vnameField.setColumns(10);
		
		knrField = new JTextField();
		knrField.setBounds(90, 60, 100, 20);
		frmAdressbuch.getContentPane().add(knrField);
		knrField.setColumns(10);
		
		strField = new JTextField();
		strField.setBounds(90, 100, 100, 20);
		frmAdressbuch.getContentPane().add(strField);
		strField.setColumns(10);
		
		nrField = new JTextField();
		nrField.setBounds(290, 100, 40, 20);
		frmAdressbuch.getContentPane().add(nrField);
		nrField.setColumns(10);
		
		plzField = new JTextField();
		plzField.setBounds(90, 140, 100, 20);
		frmAdressbuch.getContentPane().add(plzField);
		plzField.setColumns(10);
		
		stdField = new JTextField();
		stdField.setBounds(290, 140, 100, 20);
		frmAdressbuch.getContentPane().add(stdField);
		stdField.setColumns(10);
		
		telField = new JTextField();
		telField.setBounds(90, 180, 100, 20);
		frmAdressbuch.getContentPane().add(telField);
		telField.setColumns(10);
		
		mailField = new JTextField();
		mailField.setBounds(290, 180, 100, 20);
		frmAdressbuch.getContentPane().add(mailField);
		mailField.setColumns(10);
		
		JSeparator separator = new JSeparator();
		separator.setBounds(10, 220, 530, 20);
		frmAdressbuch.getContentPane().add(separator);
		
		JButton btnSpeichern = new JButton("Speichern");
		btnSpeichern.setBounds(445, 40, 95, 20);
		btnSpeichern.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				sp = "INSERT INTO adressen (knr,name,vname,str,nr,plz,std,tel,mail) VALUES ('"	       
	        + knrField.getText() 
	        + "','"  
	        + nameField.getText() 
	        + "','" 
	        + vnameField.getText() 
	        + "','" 
	        + strField.getText()
	        + "','" 
	        + nrField.getText()
	        + "','" 
	    	+ plzField.getText()
	    	+ "','" 
	        + stdField.getText()
	        + "','" 
	        + telField.getText()
	        + "','" 
	        + mailField.getText()
	        + "')"; 
				System.out.println(""+sp);
				try {
					int rs = stmt.executeUpdate(sp);
					
					System.out.println(""+rs);
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}				
			}
		});
		frmAdressbuch.getContentPane().add(btnSpeichern);
		
		JButton btnAendern = new JButton("\u00C4ndern");
		btnAendern.setBounds(445, 100, 95, 20);
		btnAendern.addActionListener(new ActionListener() {



			@Override
			public void actionPerformed(ActionEvent e) {

				ae = "UPDATE adressen SET name ='"	        
	        + nameField.getText() 
	        + "', vname ='" 
	        + vnameField.getText() 
	        + "', str ='" 
	        + strField.getText()
	        + "', nr ='" 
	        + nrField.getText()
	        + "', plz ='" 
	    	+ plzField.getText()
	    	+ "', std ='" 
	        + stdField.getText()
	        + "', tel ='" 
	        + telField.getText()
	        + "', mail ='" 
	        + mailField.getText()
	        + "' WHERE knr ='"
	        + knrField.getText()
	        + "';";
			
				
	         
				System.out.println(""+ae);
				try {
					int rs = stmt.executeUpdate(ae);
					
					System.out.println(""+rs);
					
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}			
			}			
			
		});
		frmAdressbuch.getContentPane().add(btnAendern);		
		
		
		JButton btnSuchen = new JButton("Suchen");
		btnSuchen.setBounds(445, 160, 95, 20);
		btnSuchen.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				su = "SELECT*FROM adressen WHERE knr='"	       
	        + knrField.getText() 
	        + "';";				
	        
				System.out.println(""+su);
				try {
					ResultSet rs = stmt.executeQuery(su);
					
					System.out.println(""+rs);
					
					while (rs.next()){
						String n = rs.getString(2);
						n= rs.getString("name");
						nameField.setText(n);
						
						String vn = rs.getString(3);
						vn= rs.getString("vname");
						vnameField.setText(vn);
						
						String st = rs.getString(4);
						st= rs.getString("str");
						strField.setText(st);
						
						String nr = rs.getString(5);
						nr= rs.getString("nr");
						nrField.setText(nr);
						
						String pl = rs.getString(6);
						pl= rs.getString("plz");
						plzField.setText(pl);
						
						String sd = rs.getString(7);
						sd= rs.getString("std");
						stdField.setText(sd);
						
						String te = rs.getString(8);
						te= rs.getString("tel");
						telField.setText(te);
						
						String ma = rs.getString(9);
						ma= rs.getString("mail");
						mailField.setText(ma);
						
					}
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}				
			}
		});
		
		frmAdressbuch.getContentPane().add(btnSuchen);		
			// Tabelle
		
			String[] titles = new String[]{"Kundennr.","Name","Vorname","Strasse", "Nr", "Stadt", "PLZ", "Telefon", "E-Mail"};
			Vector<Vector> data = new Vector<Vector>();
			final DefaultTableModel model = new DefaultTableModel(titles,0);
			String sql = "SELECT * FROM adressen";
			try {	        	
				ResultSet as = stmt.executeQuery(sql);	        	
				ResultSetMetaData md = as.getMetaData();
	        	
				int columns = md.getColumnCount();
				
				while (as.next()){
					Vector<Object> row = new Vector<Object>(columns);
	                
	                for (int i = 2; i <= columns; i++) {
	                    row.addElement( as.getObject(i) );
	                }
	                model.addRow(row);
	                
				}
			} catch (SQLException e1) {
				
				e1.printStackTrace();
			}
			
			
				
				
			
			
			
			
			
			final JTable table = new JTable(model);
	        
	        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//	        table.setPreferredScrollableViewportSize(new Dimension(800,300));
//	        table.setPreferredSize(new Dimension(750,300));
	        table.setSize(new Dimension(800,300));	        			
	        JScrollPane scrollPane =  new JScrollPane();
	        scrollPane.setBounds(10, 250, 530, 300);	        
	        scrollPane.getViewport().add(table);
	        
	        table.addMouseListener(new MouseAdapter() {
	        	
	        	@Override
	        	public void mouseClicked(MouseEvent e) {	        		
	        		
	        		int row = table.getSelectedRow();
	        		
	        		Object knr =table.getModel().getValueAt(row, 0);
	        		String a =knr.toString();
	        		knrField.setText(a);
	        		
	        		Object name =table.getModel().getValueAt(row, 1);
	        		String b =name.toString();
	        		nameField.setText(b);
	        		
	        		Object vname =table.getModel().getValueAt(row, 2);
	        		String c =vname.toString();
	        		vnameField.setText(c);
	        		
	        		Object str =table.getModel().getValueAt(row, 3);
	        		String d =str.toString();
	        		strField.setText(d);
	        		
	        		Object nr =table.getModel().getValueAt(row, 4);
	        		String t =nr.toString();
	        		nrField.setText(t);
	        		
	        		Object plz =table.getModel().getValueAt(row, 5);
	        		String f =plz.toString();
	        		plzField.setText(f);
	        		
	        		Object std =table.getModel().getValueAt(row, 6);
	        		String g =std.toString();
	        		stdField.setText(g);
	        		
	        		Object tel =table.getModel().getValueAt(row, 7);
	        		String h =tel.toString();
	        		telField.setText(h);
	        		
	        		Object mail =table.getModel().getValueAt(row, 8);
	        		String i =mail.toString();
	        		mailField.setText(i);
	        		
	            }        	
			});	        
	        frmAdressbuch.getContentPane().add(scrollPane);
	        table.getModel().addTableModelListener(this);
	        
	        
	}


	@Override
	public void tableChanged(TableModelEvent e) {
		int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object data = model.getValueAt(row, column);
        TableModelEvent(TableModelEvent.UPDATE);
	}


	


	   		
}
```


----------



## SlaterB (25. Sep 2012)

hmm, was ist denn der Plan?
die Listener, ob von Suchen oder Ändern, scheinen weiter unberührt,
sind die Zeilen 341 - 363 neu? nein auch nicht,
zum ersten Post ist tableChanged() neu, anscheinend ohne Relevanz (oder ist was geplant?)
und einige Leerzeilen um 365 rum


nach wie vor gilt: auf einen Buttonklick erfolgt eine Aktion,
in einen Listener, in eine actionPerformed(), muss Code hinein,
genau der Code der deine Wünsche erfüllt, z.B. eine DB-Abfrage + Erstellen eines Models usw.,

solange du nichts in einen Listener einfügst, gibt es nichts zu korrigieren/ beurteilen


----------



## BigMac (26. Sep 2012)

Ok jetzt hab ich es gelöst und es Funktioniert. Vielen Dank.
Ich bekomm aber eine fehlermeldung nachdem ich einen eintrag verändert habe und eine andere zeile in der tabelle anklicken möchte.
Der Code:

```
package adressbuch;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;



public class AdressBuch extends JFrame  {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6950577656155165307L;
	private JFrame frmAdressbuch;
	private JTextField nameField;
	private JTextField vnameField;
	private JTextField knrField;
	private JTextField strField;
	private JTextField nrField;
	private JTextField plzField;
	private JTextField stdField;
	private JTextField telField;
	private JTextField mailField;
	private static  Statement stmt;
	static String sp;
	static String ae;
	static String su;
	static String sql;
	private JTable table = null;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) throws ClassNotFoundException, SQLException {

		String user = "root";
		String pw = "";
		String url = "jdbc:mysql://localhost/adressen";


		Class.forName("com.mysql.jdbc.Driver");		
		
		Connection  con = DriverManager.getConnection(url,user,pw);

		stmt = con.createStatement();

		
		AdressBuch window = new AdressBuch();
		window.frmAdressbuch.setVisible(true);
		

		System.out.println("Gui läuft");
	}



	/**
	 * Initialize the contents of the frame.
	 * @ 
	 */
	public  AdressBuch( ) {
		
		frmAdressbuch = new JFrame();
		frmAdressbuch.setTitle("Adressbuch");
		frmAdressbuch.setBounds(100, 100, 565, 600);
		frmAdressbuch.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmAdressbuch.getContentPane().setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Name");
		lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel.setBounds(10, 20, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel);
		
		JLabel lblNewLabel_1 = new JLabel("Vorname");
		lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_1.setBounds(210, 20, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_1);
		
		JLabel lblNewLabel_2 = new JLabel("Kundennr.");
		lblNewLabel_2.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_2.setBounds(10, 60, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_2);
		
		JLabel lblNewLabel_3 = new JLabel("Strasse");
		lblNewLabel_3.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_3.setBounds(10, 100, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_3);
		
		JLabel lblNewLabel_4 = new JLabel("Nr.");
		lblNewLabel_4.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_4.setBounds(210, 100, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_4);
		
		JLabel lblNewLabel_5 = new JLabel("PLZ");
		lblNewLabel_5.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_5.setBounds(10, 140, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_5);
		
		JLabel lblNewLabel_6 = new JLabel("Stadt");
		lblNewLabel_6.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_6.setBounds(210, 140, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_6);
		
		JLabel lblNewLabel_7 = new JLabel("Telefon");
		lblNewLabel_7.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_7.setBounds(10, 180, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_7);
		
		JLabel lblNewLabel_8 = new JLabel("E-Mail");
		lblNewLabel_8.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_8.setBounds(210, 180, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_8);
		
		nameField = new JTextField();
		nameField.setBounds(90, 20, 100, 20);
		frmAdressbuch.getContentPane().add(nameField);
		nameField.setColumns(10);
		
		vnameField = new JTextField();
		vnameField.setBounds(290, 20, 100, 20);
		frmAdressbuch.getContentPane().add(vnameField);
		vnameField.setColumns(10);
		
		knrField = new JTextField();
		knrField.setBounds(90, 60, 100, 20);
		frmAdressbuch.getContentPane().add(knrField);
		knrField.setColumns(10);
		
		strField = new JTextField();
		strField.setBounds(90, 100, 100, 20);
		frmAdressbuch.getContentPane().add(strField);
		strField.setColumns(10);
		
		nrField = new JTextField();
		nrField.setBounds(290, 100, 40, 20);
		frmAdressbuch.getContentPane().add(nrField);
		nrField.setColumns(10);
		
		plzField = new JTextField();
		plzField.setBounds(90, 140, 100, 20);
		frmAdressbuch.getContentPane().add(plzField);
		plzField.setColumns(10);
		
		stdField = new JTextField();
		stdField.setBounds(290, 140, 100, 20);
		frmAdressbuch.getContentPane().add(stdField);
		stdField.setColumns(10);
		
		telField = new JTextField();
		telField.setBounds(90, 180, 100, 20);
		frmAdressbuch.getContentPane().add(telField);
		telField.setColumns(10);
		
		mailField = new JTextField();
		mailField.setBounds(290, 180, 100, 20);
		frmAdressbuch.getContentPane().add(mailField);
		mailField.setColumns(10);
		
		JSeparator separator = new JSeparator();
		separator.setBounds(10, 220, 530, 20);
		frmAdressbuch.getContentPane().add(separator);
		
		JButton btnSpeichern = new JButton("Speichern");
		btnSpeichern.setBounds(445, 40, 95, 20);
		btnSpeichern.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				sp = "INSERT INTO adressen (knr,name,vname,str,nr,plz,std,tel,mail) VALUES ('"	       
	        + knrField.getText() 
	        + "','"  
	        + nameField.getText() 
	        + "','" 
	        + vnameField.getText() 
	        + "','" 
	        + strField.getText()
	        + "','" 
	        + nrField.getText()
	        + "','" 
	    	+ plzField.getText()
	    	+ "','" 
	        + stdField.getText()
	        + "','" 
	        + telField.getText()
	        + "','" 
	        + mailField.getText()
	        + "')"; 
				System.out.println(""+sp);
				try {
					int rs = stmt.executeUpdate(sp);
					
					System.out.println(""+rs);
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}				
			}
		});
		frmAdressbuch.getContentPane().add(btnSpeichern);
		
		
		JButton btnAendern = new JButton("\u00C4ndern");
		btnAendern.setBounds(445, 100, 95, 20);
		btnAendern.addActionListener(new ActionListener() {



			@Override
			public void actionPerformed(ActionEvent e) {

				ae = "UPDATE adressen SET name ='"	        
	        + nameField.getText() 
	        + "', vname ='" 
	        + vnameField.getText() 
	        + "', str ='" 
	        + strField.getText()
	        + "', nr ='" 
	        + nrField.getText()
	        + "', plz ='" 
	    	+ plzField.getText()
	    	+ "', std ='" 
	        + stdField.getText()
	        + "', tel ='" 
	        + telField.getText()
	        + "', mail ='" 
	        + mailField.getText()
	        + "' WHERE knr ='"
	        + knrField.getText()
	        + "';";				
	         
				System.out.println(""+ae);
				try {
					int rs = stmt.executeUpdate(ae);
					
					System.out.println(""+rs);
					TableModel();
				} catch (Exception ex) {
					ex.printStackTrace();
				}
				
			}			
			
		});
		frmAdressbuch.getContentPane().add(btnAendern);		
		
		
		JButton btnSuchen = new JButton("Suchen");
		btnSuchen.setBounds(445, 160, 95, 20);
		btnSuchen.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				su = "SELECT*FROM adressen WHERE knr='"	       
	        + knrField.getText() 
	        + "';";				
	        
				System.out.println(""+su);
				try {
					ResultSet rs = stmt.executeQuery(su);
					
					System.out.println(""+rs);
					
					while (rs.next()){
						String n = rs.getString(2);
						n= rs.getString("name");
						nameField.setText(n);
						
						String vn = rs.getString(3);
						vn= rs.getString("vname");
						vnameField.setText(vn);
						
						String st = rs.getString(4);
						st= rs.getString("str");
						strField.setText(st);
						
						String nr = rs.getString(5);
						nr= rs.getString("nr");
						nrField.setText(nr);
						
						String pl = rs.getString(6);
						pl= rs.getString("plz");
						plzField.setText(pl);
						
						String sd = rs.getString(7);
						sd= rs.getString("std");
						stdField.setText(sd);
						
						String te = rs.getString(8);
						te= rs.getString("tel");
						telField.setText(te);
						
						String ma = rs.getString(9);
						ma= rs.getString("mail");
						mailField.setText(ma);
						
					}
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}				
			}
		});
		
		frmAdressbuch.getContentPane().add(btnSuchen);		
			// Tabelle
			TableModel();
//			String[] titles = new String[]{"Kundennr.","Name","Vorname","Strasse", "Nr", "Stadt", "PLZ", "Telefon", "E-Mail"};			
//			final DefaultTableModel model = new DefaultTableModel(titles,0);
//			String sql = "SELECT * FROM adressen";
//			try {	        	
//				ResultSet as = stmt.executeQuery(sql);	        	
//				ResultSetMetaData md = as.getMetaData();
//	        	
//				int columns = md.getColumnCount();
//				
//				while (as.next()){
//					Vector<Object> row = new Vector<Object>(columns);
//	                
//	                for (int i = 2; i <= columns; i++) {
//	                    row.addElement( as.getObject(i) );
//	                }
//	                model.addRow(row);
//	                
//				}
//			} catch (SQLException e1) {
//				
//				e1.printStackTrace();
//			}			
			
//			final JTable table = new JTable(model);
			
	        
	             
	}	
	private  void TableModel(){
		
		String[] titles = new String[]{"Kundennr.","Name","Vorname","Strasse", "Nr", "PLZ", "Stadt", "Telefon", "E-Mail"};			
		final DefaultTableModel model = new DefaultTableModel(titles,0);
		String sql = "SELECT * FROM adressen";
		try {	        	
			ResultSet as = stmt.executeQuery(sql);	        	
			ResultSetMetaData md = as.getMetaData();
        	
			int columns = md.getColumnCount();
			
			while (as.next()){
				Vector<Object> row = new Vector<Object>(columns);
                
                for (int i = 2; i <= columns; i++) {
                    row.addElement( as.getObject(i) );
                }
                model.addRow(row);
                
			}
		} catch (SQLException e1) {
			
			e1.printStackTrace();
		}
		table = new JTable(model);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//        table.setPreferredScrollableViewportSize(new Dimension(800,300));
//        table.setPreferredSize(new Dimension(750,300));
        table.setSize(new Dimension(800,300));	        			
        JScrollPane scrollPane =  new JScrollPane();
        scrollPane.setBounds(10, 250, 530, 300);	        
        scrollPane.getViewport().add(table);
        
        
        
        table.addMouseListener(new MouseAdapter() {
        	
        	@Override
        	public void mouseClicked(MouseEvent e) {	        		
        		
        		int row = table.getSelectedRow();
        		
        		
        		Object knr =table.getModel().getValueAt(row, 0);
        		String a =knr.toString();
        		knrField.setText(a);
        		
        		Object name =table.getModel().getValueAt(row, 1);
        		String b =name.toString();
        		nameField.setText(b);
        		
        		Object vname =table.getModel().getValueAt(row, 2);
        		String c =vname.toString();
        		vnameField.setText(c);
        		
        		Object str =table.getModel().getValueAt(row, 3);
        		String d =str.toString();
        		strField.setText(d);
        		
        		Object nr =table.getModel().getValueAt(row, 4);
        		String t =nr.toString();
        		nrField.setText(t);
        		
        		Object plz =table.getModel().getValueAt(row, 5);
        		String f =plz.toString();
        		stdField.setText(f);
        		
        		Object std =table.getModel().getValueAt(row, 6);
        		String g =std.toString();
        		plzField.setText(g);
        		
        		Object tel =table.getModel().getValueAt(row, 7);
        		String h =tel.toString();
        		telField.setText(h);
        		
        		Object mail =table.getModel().getValueAt(row, 8);
        		String i =mail.toString();
        		mailField.setText(i);
            }        	
		});	        
        frmAdressbuch.getContentPane().add(scrollPane);
        
	}
}
```

Die Fehlermeldung:

```
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
	at java.util.Vector.elementData(Unknown Source)
	at java.util.Vector.elementAt(Unknown Source)
	at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
	at adressbuch.AdressBuch$4.mouseClicked(AdressBuch.java:403)
	at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```


----------



## SlaterB (26. Sep 2012)

table.getSelectedRow() ist anscheinend -1, mit System.out.println() loggen,
warum kann ich gerade nicht gut sagen, da dein Programm DB-Code und keine Dummy-Daten enthält leider auch nicht auf die Schnelle zu testen

falls direkt danach ein zweites Event mit der richtigen SelectedRow kommt wäre es verkraftbar, von einem MouseListener kenne ich das allerdings weniger..,
wenn kein zweites Event kommt und in der Tabelle eine sinnvolle Zeile markiert ist, du aber nur ein Event mit getSelectedRow() == -1 ist,
wäre das in der Tat ein Problem mit dem begrenzten, kaum beeinflussbaren Angebot von Swing, mit dem man leben muss,

oder klickst du zufällig wer weiß wo hin, so dass keine Zeile markiert ist?
na, ich bräuchte eigentlich ein Testprogramm um irgendwas zu sagen,
wenn du interessiert am Ball bleibst, probiere ich es vielleicht bald selber aus 

falls jedenfalls table.getSelectedRow() -1 liefert, was du mit deiner Variablen row ja prüfen kannst,
dann ist im Rest der Methode nicht mehr viel zu machen, Abbruch, ein if einbauen


----------



## BigMac (26. Sep 2012)

ok ich habs durchgetestet. Ich hab 3 Zeilen in der Tabell mit Kundennr, name, usw als Spalten.
Wenn ich das Programm öffne und auf die erste Zeile klick, ist row=0(zweite zeile 1, dritte 2) so wie es sein sollte.

Wenn ich jetzt etwas verändere(egal was) in der ausgewählten zeile, dann funktioniert es auch
(UPDATE adressen SET name ='bauer1', vname ='hans2', str ='Leetstreet3', nr ='24', plz ='623432', std ='neustadt', tel ='08151337', mail ='mail@iwo.com' WHERE knr ='1'; ).

Wenn ich jetzt auf eine andere zeile Springe(egal welche Spalte) dann wird row -1.

Ich glaub es hackt im listener vom btnAendern.

Wo soll ich das if einbauen und wozu?


----------



## BigMac (26. Sep 2012)

ich habs gelöst
man musste 

```
int row = table.rowAtPoint(e.getPoint());
```
einfügen

aber wieso das so ist habe ich keine ahnung
vielleicht kann es ja jemand auflösen.

Hier der komplette Code:


```
package adressbuch;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;



public class AdressBuch extends JFrame  {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6950577656155165307L;
	private JFrame frmAdressbuch;
	private JTextField nameField;
	private JTextField vnameField;
	private JTextField knrField;
	private JTextField strField;
	private JTextField nrField;
	private JTextField plzField;
	private JTextField stdField;
	private JTextField telField;
	private JTextField mailField;
	private static  Statement stmt;
	static String sp;
	static String ae;
	static String su;
	static String sql;
	private JTable table = null;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) throws ClassNotFoundException, SQLException {

		String user = "root";
		String pw = "";
		String url = "jdbc:mysql://localhost/adressen";


		Class.forName("com.mysql.jdbc.Driver");		
		
		Connection  con = DriverManager.getConnection(url,user,pw);

		stmt = con.createStatement();

		
		AdressBuch window = new AdressBuch();
		window.frmAdressbuch.setVisible(true);
		

		System.out.println("Gui läuft");
	}



	/**
	 * Initialize the contents of the frame.
	 * @ 
	 */
	public  AdressBuch( ) {
		
		frmAdressbuch = new JFrame();
		frmAdressbuch.setTitle("Adressbuch");
		frmAdressbuch.setBounds(100, 100, 565, 600);
		frmAdressbuch.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmAdressbuch.getContentPane().setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Name");
		lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel.setBounds(10, 20, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel);
		
		JLabel lblNewLabel_1 = new JLabel("Vorname");
		lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_1.setBounds(210, 20, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_1);
		
		JLabel lblNewLabel_2 = new JLabel("Kundennr.");
		lblNewLabel_2.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_2.setBounds(10, 60, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_2);
		
		JLabel lblNewLabel_3 = new JLabel("Strasse");
		lblNewLabel_3.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_3.setBounds(10, 100, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_3);
		
		JLabel lblNewLabel_4 = new JLabel("Nr.");
		lblNewLabel_4.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_4.setBounds(210, 100, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_4);
		
		JLabel lblNewLabel_5 = new JLabel("PLZ");
		lblNewLabel_5.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_5.setBounds(10, 140, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_5);
		
		JLabel lblNewLabel_6 = new JLabel("Stadt");
		lblNewLabel_6.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_6.setBounds(210, 140, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_6);
		
		JLabel lblNewLabel_7 = new JLabel("Telefon");
		lblNewLabel_7.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_7.setBounds(10, 180, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_7);
		
		JLabel lblNewLabel_8 = new JLabel("E-Mail");
		lblNewLabel_8.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNewLabel_8.setBounds(210, 180, 70, 20);
		frmAdressbuch.getContentPane().add(lblNewLabel_8);
		
		nameField = new JTextField();
		nameField.setBounds(90, 20, 100, 20);
		frmAdressbuch.getContentPane().add(nameField);
		nameField.setColumns(10);
		
		vnameField = new JTextField();
		vnameField.setBounds(290, 20, 100, 20);
		frmAdressbuch.getContentPane().add(vnameField);
		vnameField.setColumns(10);
		
		knrField = new JTextField();
		knrField.setBounds(90, 60, 100, 20);
		frmAdressbuch.getContentPane().add(knrField);
		knrField.setColumns(10);
		
		strField = new JTextField();
		strField.setBounds(90, 100, 100, 20);
		frmAdressbuch.getContentPane().add(strField);
		strField.setColumns(10);
		
		nrField = new JTextField();
		nrField.setBounds(290, 100, 40, 20);
		frmAdressbuch.getContentPane().add(nrField);
		nrField.setColumns(10);
		
		plzField = new JTextField();
		plzField.setBounds(90, 140, 100, 20);
		frmAdressbuch.getContentPane().add(plzField);
		plzField.setColumns(10);
		
		stdField = new JTextField();
		stdField.setBounds(290, 140, 100, 20);
		frmAdressbuch.getContentPane().add(stdField);
		stdField.setColumns(10);
		
		telField = new JTextField();
		telField.setBounds(90, 180, 100, 20);
		frmAdressbuch.getContentPane().add(telField);
		telField.setColumns(10);
		
		mailField = new JTextField();
		mailField.setBounds(290, 180, 100, 20);
		frmAdressbuch.getContentPane().add(mailField);
		mailField.setColumns(10);
		
		JSeparator separator = new JSeparator();
		separator.setBounds(10, 220, 530, 20);
		frmAdressbuch.getContentPane().add(separator);
		
		JButton btnSpeichern = new JButton("Speichern");
		btnSpeichern.setBounds(445, 40, 95, 20);
		btnSpeichern.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				sp = "INSERT INTO adressen (knr,name,vname,str,nr,plz,std,tel,mail) VALUES ('"	       
	        + knrField.getText() 
	        + "','"  
	        + nameField.getText() 
	        + "','" 
	        + vnameField.getText() 
	        + "','" 
	        + strField.getText()
	        + "','" 
	        + nrField.getText()
	        + "','" 
	    	+ plzField.getText()
	    	+ "','" 
	        + stdField.getText()
	        + "','" 
	        + telField.getText()
	        + "','" 
	        + mailField.getText()
	        + "')"; 
				System.out.println(""+sp);
				try {
					int rs = stmt.executeUpdate(sp);
					
					System.out.println(""+rs);
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}				
			}
		});
		frmAdressbuch.getContentPane().add(btnSpeichern);
		
		
		JButton btnAendern = new JButton("\u00C4ndern");
		btnAendern.setBounds(445, 100, 95, 20);
		btnAendern.addActionListener(new ActionListener() {



			@Override
			public void actionPerformed(ActionEvent e) {

				ae = "UPDATE adressen SET name ='"	        
	        + nameField.getText() 
	        + "', vname ='" 
	        + vnameField.getText() 
	        + "', str ='" 
	        + strField.getText()
	        + "', nr ='" 
	        + nrField.getText()
	        + "', plz ='" 
	    	+ plzField.getText()
	    	+ "', std ='" 
	        + stdField.getText()
	        + "', tel ='" 
	        + telField.getText()
	        + "', mail ='" 
	        + mailField.getText()
	        + "' WHERE knr ='"
	        + knrField.getText()
	        + "';";				
	         
				System.out.println(""+ae);
				try {
					int rs = stmt.executeUpdate(ae);
					
					System.out.println(""+rs);
					TableModel();
				} catch (Exception ex) {
					ex.printStackTrace();
				}
				
			}			
			
		});
		frmAdressbuch.getContentPane().add(btnAendern);		
		
		
		JButton btnSuchen = new JButton("Suchen");
		btnSuchen.setBounds(445, 160, 95, 20);
		btnSuchen.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				su = "SELECT*FROM adressen WHERE knr='"	       
	        + knrField.getText() 
	        + "';";				
	        
				System.out.println(""+su);
				try {
					ResultSet rs = stmt.executeQuery(su);
					
					System.out.println(""+rs);
					
					while (rs.next()){
						String n = rs.getString(2);
						n= rs.getString("name");
						nameField.setText(n);
						
						String vn = rs.getString(3);
						vn= rs.getString("vname");
						vnameField.setText(vn);
						
						String st = rs.getString(4);
						st= rs.getString("str");
						strField.setText(st);
						
						String nr = rs.getString(5);
						nr= rs.getString("nr");
						nrField.setText(nr);
						
						String pl = rs.getString(6);
						pl= rs.getString("plz");
						plzField.setText(pl);
						
						String sd = rs.getString(7);
						sd= rs.getString("std");
						stdField.setText(sd);
						
						String te = rs.getString(8);
						te= rs.getString("tel");
						telField.setText(te);
						
						String ma = rs.getString(9);
						ma= rs.getString("mail");
						mailField.setText(ma);
						
					}
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}				
			}
		});
		
		frmAdressbuch.getContentPane().add(btnSuchen);		
			// Tabelle
			TableModel();
//			String[] titles = new String[]{"Kundennr.","Name","Vorname","Strasse", "Nr", "Stadt", "PLZ", "Telefon", "E-Mail"};			
//			final DefaultTableModel model = new DefaultTableModel(titles,0);
//			String sql = "SELECT * FROM adressen";
//			try {	        	
//				ResultSet as = stmt.executeQuery(sql);	        	
//				ResultSetMetaData md = as.getMetaData();
//	        	
//				int columns = md.getColumnCount();
//				
//				while (as.next()){
//					Vector<Object> row = new Vector<Object>(columns);
//	                
//	                for (int i = 2; i <= columns; i++) {
//	                    row.addElement( as.getObject(i) );
//	                }
//	                model.addRow(row);
//	                
//				}
//			} catch (SQLException e1) {
//				
//				e1.printStackTrace();
//			}			
			
//			final JTable table = new JTable(model);
			
	        
	             
	}	
	private  void TableModel(){
		
		String[] titles = new String[]{"Kundennr.","Name","Vorname","Strasse", "Nr", "PLZ", "Stadt", "Telefon", "E-Mail"};			
		final DefaultTableModel model = new DefaultTableModel(titles,0);
		String sql = "SELECT * FROM adressen";
		try {	        	
			ResultSet as = stmt.executeQuery(sql);	        	
			ResultSetMetaData md = as.getMetaData();
        	
			int columns = md.getColumnCount();
			
			while (as.next()){
				Vector<Object> row = new Vector<Object>(columns);
                
                for (int i = 2; i <= columns; i++) {
                    row.addElement( as.getObject(i) );
                }
                model.addRow(row);
                
			}
		} catch (SQLException e1) {
			
			e1.printStackTrace();
		}
		table = new JTable(model);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//        table.setPreferredScrollableViewportSize(new Dimension(800,300));
//        table.setPreferredSize(new Dimension(750,300));
        table.setSize(new Dimension(800,300));	        			
        JScrollPane scrollPane =  new JScrollPane();
        scrollPane.setBounds(10, 250, 530, 300);	        
        scrollPane.getViewport().add(table);
        
        
        
        table.addMouseListener(new MouseAdapter() {
        	
        	@Override
        	public void mouseClicked(MouseEvent e) {	        		
        		
//        		int row = table.getSelectedRow();
        		int row = table.rowAtPoint(e.getPoint());
        		System.out.print(row);
        		
        		Object knr =table.getModel().getValueAt(row, 0);
        		String a =knr.toString();
        		knrField.setText(a);
        		
        		Object name =table.getModel().getValueAt(row, 1);
        		String b =name.toString();
        		nameField.setText(b);
        		
        		Object vname =table.getModel().getValueAt(row, 2);
        		String c =vname.toString();
        		vnameField.setText(c);
        		
        		Object str =table.getModel().getValueAt(row, 3);
        		String d =str.toString();
        		strField.setText(d);
        		
        		Object nr =table.getModel().getValueAt(row, 4);
        		String t =nr.toString();
        		nrField.setText(t);
        		
        		Object plz =table.getModel().getValueAt(row, 6);
        		String f =plz.toString();
        		stdField.setText(f);
        		
        		Object std =table.getModel().getValueAt(row, 5);
        		String g =std.toString();
        		plzField.setText(g);
        		
        		Object tel =table.getModel().getValueAt(row, 7);
        		String h =tel.toString();
        		telField.setText(h);
        		
        		Object mail =table.getModel().getValueAt(row, 8);
        		String i =mail.toString();
        		mailField.setText(i);
            }        	
		});	        
        frmAdressbuch.getContentPane().add(scrollPane);
        
	}
}
```

Ich danke allen für ihre hilfe.


----------

