AbstractTableModel

brunso

Mitglied
Hallo zusammen,

ich taste mich so langsam an das TableModel heran,

ich lade ein resultSet aus meiner DB, schmeisse den ganzen Kram in die Tabelle, alles wunderbar. Ich habe die Möglichkeit über ein JTextField ein neues Query zu bauen und abzuschicken, funktzioniert alles wunderbar.

Nur wenn ich jetzt die Zellen editieren will wird der geänderte Wert nicht angezeigt.

In
Code:
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		  
		aValue = (Object) data[rowIndex][columnIndex];

	      

		  
		  

	  }

habe ih probleme, glaube, da mein data ja ein Vector ist und ich da nicht die Koordinaten korrkt rausbekomme.

Hier ma die ganze Class:

Code:
public class PXTableModel extends AbstractTableModel{

	/**
	 * 
	 */
	private static final long serialVersionUID = 7505358431169338941L;
	public Vector data;
	private Vector columnNames;

	
	public PXTableModel( Vector data, Vector columNames) 
	   { 
	      this.columnNames = columNames; 
	      this.data = data; 
	   } 
	    
	   public void setData( Vector data ) { 
	       this.data = data; 
	       fireTableDataChanged(); 
	   }
	   
	   public Vector getData() { 
	    return data; 
	   } 
	    
	   public int getRowCount() { 	
	      // TODO Automatisch erstellter Methoden-Stub 
	    return data.size(); 
	   }
	   
	   public int getColumnCount() { 
	      // TODO Automatisch erstellter Methoden-Stub 
	    return columnNames.size(); 
	   }
	   
	   public String getColumnName(int col) { 
		return columnNames.elementAt(col).toString(); 
	   }
	   
	   public Object getValueAt(int rowIndex, int columnIndex) {
		return ((Vector) getData().get(rowIndex)).get(columnIndex);	
	}

	  public boolean isCellEditable(int row, int col) {
		  
		return true;
		  
	  }
	  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		  
		aValue = (Object) data[rowIndex][columnIndex];

	      

		  
		  

	  }

}


Gruss
brunso
 
Hallo,

Wieso benutzt du nicht das DefaultTableModel? Das funktioniert genauso, du kannst auch den Constructor mit zwei Vectoren benutzen.
 
okay, aber das ändert an meinem Problem nichts!

bekomme es trotzdem nicht hin, dass der geänderte wert angezeigt wird!
 
Zuletzt bearbeitet:
Moin!
Code:
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
          
        aValue = (Object) data[rowIndex][columnIndex];

      }
Falsche Richtung. Du weist dem neuen Wert aValue hier deinen Wert aus deinen Daten zu. Anderum wäre sinnvoller...
Code:
data[rowIndex][columnIndex] = aValue

PS: Auch drank denken, alle TableModelListener über die Veränderung zu informieren

*grüssle*
MeinerEiner
 
ähh,

vielleicht steh ich ja jetzt total auf dem Schlauch. welche TableModelListener? bis jetzt brauchte ich keine, die Table hat alles gemacht!

sorry, auch andersrum, wie du es schreibst, geht esnicht. eclipse meckert. data ist ja mein Vector und data[][] ja ein Array!
 
Hallo,

diese Listener können von dir, jemannd anderes (der dein Model benutzt) oder sogar von Swing selbst genutzt werden. Dies ist die Informationsquelle für alle, wenn es um Veränderungen am TableModel geht. Also nicht denken "ich hab keine Listener hinterlegt. Also brauch ich keine Listener informieren". Denn all zu oft hängt Swing schon Listener an Komponenten. Daher ist es wichtig diese zu informieren.
Das ist ein allgemeiner Tip zu Swing.
Die Methoden Add,Get und Remove - TableModelListener findest du schon im AbstractTableModel, das du also dank DefaultTableModel schon mit an Bord hast. Die GetMethode liefert dir einen Array an Listenern zurück, und du brauchst ja nur mit einer for-Schleife alle durch gehen und ein Event abfeuern.
 
Zuletzt bearbeitet:
Hmm,

wo soll ich den Listener denn dranschrauben? Ma ganz blöd gefragt!

Okay, aber ich kann in der Methode setValueAt() die neuen Werte Auslesen, NUR ich bekomme sie nicht zurückgeschrieben, WEIL ja, keine Ahnung warum nicht. es hat wohl was mit dem Vector zutun.

Also die Frage ist doch, wie komme ich in Bezug auf meinen Datenvektor an die x- und y-Koordinate um dann zu sagen schieb value bitte da rein.
 
Zuletzt bearbeitet:
Ich bin mir auch nicht ganz sicher, ob es Not tut diese Methode zu überschreiben. Warum verwendest du nicht einfach dein Model. Beim DefaultTableModel gibt es eine Methode setDataVector(Vector data,Vector columnIdent). Nimm die doch einfach an der Stelle, an der du das Ergebnis einer neuen Query bekommst. data ist ein Vector mit Vectoren, die jeweils eine Zeile darstellen (wie du es schon von der Instanzierung des Models kennst). Naja und den Rest brauch ich eigentlich nicht vorkauen, da es ja in der Api steht. Schau dir da mal die Methode an.
 
Sorry, aber auch das geht nicht! Bekomme so langsam die kriese.

In setDataVector wird ja der komplette kram der Tabelle ins Table geschrieben. wie soll ich denn dann damit exakt eine zelle ändern

Sorry, kapiers nicht!
 
Achso. Sry das hab ich überlesen. Dann nutzte einfach die Methode setValueAt(...). Also nicht überschreiben, sondern einfach nur nutzen. Wieder an der Stelle, an der du das Ergebnis deines neuen Querys bekommst.
 
Zurück