# JTable-DB: Letzter wert wird nicht angezeigt.



## loxol315 (28. Mrz 2014)

hey ich habe ein programm zusammengestellt was eine tabelle die in einer DB gespeichert ist ausgibt und die ich verändern kann(zeile hinzufügen und speichern). wenn ich aber testwerte eingebe zb
priorität | aufgabe
1 | test1
2 | test2
3 | test3
4 | test4

und die daten speicher und dann das programm schließe und wieder öffne fehlt aber das "test4" dh der letzte wert der zweiten spalte wird nicht angezeigt
hier der ganze code: 



Spoiler: ganzer code





```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.table.*;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
		
public class Projekt {
	Connection con = null;
	DefaultTableModel tabModel;
	JTable tab;
	
	
	
    public final static Vector COLUMN_IDENTIFIERS = new Vector() {//spalten festlegen
        {
            add("Priorität");							//spaltennamen werden in der tabelle hinzugefügt
            add("Aufgabe");
        }// new vector
    };//p f s vector

 public static void main (String args[]){
	Projekt p = new Projekt();
	 
	
 }// p s v main
 public Projekt(){

	 initDatabaseStuff(); 								//methode wird abgerufen
	 
	 Vector results = daten();							//results werden abgerufen

//#########################################################################################################    
	 tabModel = new DefaultTableModel(3, 2);			//erstellt 2 spalten und 3 zeilen
     tabModel.setColumnIdentifiers(COLUMN_IDENTIFIERS);	//tabelle mit defaulttablemodel wird erstellt
     													//defaulttablemodel wird benötigt um bei einer tabelle zeilen oder spalten hinzu zu fügen
	 tabModel.setDataVector(results, COLUMN_IDENTIFIERS);//daten werden in die tabelle geladen
	 
	 tab = new JTable(tabModel); 						//tabelle wird erstellt
	 tab.getTableHeader().setReorderingAllowed(false);	//spaltennamen lassen sich nciht verschieben
	 JScrollPane sP = new JScrollPane(tab); 			//ein feld mit einer scrollleiste wird erstellt und die tabelle in diese hineingeladen
//#########################################################################################################	 
	 TableRowSorter<TableModel> sort = new TableRowSorter<TableModel>();//der sortierer sort wird erstellt
	 tab.setRowSorter(sort);							//fügt sort der tabelle zu
	 sort.setModel(tabModel);							//
	 sort.setSortable(1, false);						//spalte 1 kann nicht sortiert werden
	 //sort.setSortsOnUpdates(true);					//wenn die eingabe gemacht wurde wird automatisch sortiert, false: es wird unübersichtlich
//#########################################################################################################	 
	 JPanel bP = new JPanel(); 							//panel für buttons wird erstellt
	 JButton addrow = new JButton("Zeile hinzufügen"); 	//button wird erstellt
	 //JButton delrow = new JButton("Markierte Zeile löschen"); //button wird erstellt
	 JButton save = new JButton("Speichern");			//button für die speicherung in die db
	 
	 bP.add(addrow); 									//button zum zeilen erstellen wird auf dem panel hinzugefügt
	 //bP.add(delrow); 									//button zum zeilen löschen wird auf dem panel hinzugefügt
	 bP.add(save);
	 
//##########################################################################################################	 

	 													//methode um eine zeile hinzu zu fügen mit dem actionlistener
	addrow.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent e){
			Object[] newrow = {"",""};	//neue zeile 
			tabModel.addRow(newrow);					//neue zeile wird im jtable hinzugefügt
			try
		     {
		    	 Statement stmt = con.createStatement();
		    		 stmt.executeUpdate("INSERT INTO `projekt2`(`Priorität`, `Task`) VALUES ('','')");//sql befehl um eine zeile in der db einzufügen  		 		    		 										//x für zeilen anzahl wird hochgezählt
		     } //try
		    catch (SQLException ce)
			{
		    	System.out.println("Fehler: "+ce);		//übersicht
				ce.printStackTrace();
			}//catch
		}//public void actionperformed
	});//Addrow
	
	/*
	// methode um eine zeile zu löschen mit einem actionlistener
	delrow.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent e){
			if (tab.getSelectedRow() != -1){
				tabModel.removeRow(tab.getSelectedRow());
			}
			else{
				if (tab.getRowCount()==0){				//wenn es keine zeilen gibt fürt ein eine errormeldung (s.u.)aus
					JOptionPane.showMessageDialog(tab, "Es sind keine Zeilen mehr vorhanden!", "Error", JOptionPane.ERROR_MESSAGE);//gibt eine fehlermeldung aus wenn keine zeilen mehr vorhanden sind
				}
				else{
					tabModel.removeRow(tab.getRowCount()-1);//wenn keine zeile markiert ist wird die letzte gelöscht
				}
			
			
			}
		
		//http://www.java-forum.org/java-basics-anfaenger-themen/37345-datenzeile-sql-db-java-loeschen.html
		}
		});
	
	*/
	save.addActionListener(new ActionListener(){		//funktion für den speichern butten, ruft die methode tabtoary auf
		public void actionPerformed(ActionEvent e){
			tabtoary();									//methode tabtoary wird aufgerufen s.u.
		}//public coid aciton performed
	});//save
	
//##################################################################################################	
	JPanel p = new JPanel();							// hauptpanel wird erstellt
	JFrame f = new JFrame("Taskliste"); 				// fenster wird erstellt
	p.setLayout(new BorderLayout()); 					//layout
	p.add(sP, "Center");								//scrollpanel wir auf dem hauptpanel hinzugefügt
	p.add(bP, "South"); 								//buttonpanel wird auf dem haupt panel hinzugefügt
	f.getContentPane().add(p); 							//panel wird auf dem fenster hinzugefügt
	f.pack(); 											//größe des fensters wird angepasst
	f.setVisible(true); 								//fenster erscheint
	
 }
 //#################################################################################################
 private void initDatabaseStuff() {						//connector
     MysqlDataSource mds = new MysqlDataSource();		
     mds.setServerName("localhost");					//addresse der datenbank
     mds.setPort(3306);									//standart port 3306				
     mds.setDatabaseName("projekt");					//name der datenbank unter der die tabelle zu finden ist
     mds.setUser("root");								//benutzername
     mds.setPassword("");							//passwaort (standart= null)
     try {
         con = mds.getConnection();
     }//try
     catch (SQLException e) {
         throw new RuntimeException(e);
     }//catch

     Runtime.getRuntime().addShutdownHook(new Thread() {//wenn du connection nicht besteht soll das programm geschlsosen werden?
         public void run() {
             try {
                 if (!con.isClosed()) {
                     con.close();
                 }//try
             } catch (SQLException e) {  
                 e.printStackTrace();
             }//catch
         }//public void run
     });//runtime
 }//private coid initdateabasestuff

 
 protected Vector daten() {								//daten werden abgerufen
	 
     Vector daten = new Vector();
     try {
         Statement stmt = con.createStatement();
         ResultSet rs = stmt.executeQuery("SELECT Priorität, Task FROM projekt2");//SELECT spaltenname FROM tabellenname

         while (rs.next()) {							//daten werden ausgelesen
             Vector inhalt = new Vector();
             inhalt.add(rs.getString("Priorität"));
             inhalt.add(rs.getString("Task"));
             daten.add(inhalt);							//daten werden in rs geschrieben
         }//while

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

     return daten;										//results werden weitergegeben
 }//vector daten
 
 //##########################################################################################################
 private void tabtoary() {								//methode mit 2d array als string
     String[][] tabstr = new String[tab.getRowCount()][tab.getColumnCount()];//array wird erstellt mit den spalten und zeilen
     for(int zeile=0; zeile<tab.getRowCount(); zeile++){			
         for(int spalte=0; spalte<tab.getColumnCount(); spalte++){
             tabstr[zeile][spalte] = tab.getValueAt(zeile, spalte).toString();//table zum string
             System.out.println(tabstr[zeile][spalte]);	//dient zur übersicht
         }//for spalte
     }//for zeile
     try
     {
    	 Statement stmt = con.createStatement();
    	 int x = 1;
    	 for(int i=0; i<tab.getRowCount(); i++){
    		 stmt.executeUpdate("UPDATE `projekt2` SET `Priorität`='"+tabstr[i][0] // daten werden aktualisiert
    				 			+"',`Task`='"+tabstr[i][1]
    				 			+"' WHERE ID = "+x);
    		 System.out.println(x);						//übersicht
    		 x++;										//x für zeilen anzahl wird hochgezählt
    	 }//for
    } //try
    catch (SQLException e)
	{
    	System.out.println("Fehler: "+e);				//übersicht
		e.printStackTrace();
	}//catch
 }//private
     


}//class
```



und hier der teil bei dem die daten gespeichert werden:


Spoiler: speicherung





```
private void tabtoary() {								//methode mit 2d array als string
     String[][] tabstr = new String[tab.getRowCount()][tab.getColumnCount()];//array wird erstellt mit den spalten und zeilen
     for(int zeile=0; zeile<tab.getRowCount(); zeile++){			
         for(int spalte=0; spalte<tab.getColumnCount(); spalte++){
             tabstr[zeile][spalte] = tab.getValueAt(zeile, spalte).toString();//table zum string
             System.out.println(tabstr[zeile][spalte]);	//dient zur übersicht
         }//for spalte
     }//for zeile
     try
     {
    	 Statement stmt = con.createStatement();
    	 int x = 1;
    	 for(int i=0; i<tab.getRowCount(); i++){
    		 stmt.executeUpdate("UPDATE `projekt2` SET `Priorität`='"+tabstr[i][0] // daten werden aktualisiert
    				 			+"',`Task`='"+tabstr[i][1]
    				 			+"' WHERE ID = "+x);
    		 System.out.println(x);						//übersicht
    		 x++;										//x für zeilen anzahl wird hochgezählt
    	 }//for
    } //try
    catch (SQLException e)
	{
    	System.out.println("Fehler: "+e);				//übersicht
		e.printStackTrace();
	}//catch
 }//private
```




ist mein erstes großes java programm, bin noch am lernen.
mfg loxol


----------

