# JTable Zelle ändern -> andere Zellen mit ändern



## matzze2000 (14. Nov 2007)

Hallo, mein Problem ist folgendes:

Ich habe ein TableModel bei dem ich Artikel, deren Preise und eine Anzahl habe. Jetzt habe ich die Spalte "Anzahl" veränderbar gemacht. Wenn man dort etwas einträgt soll automatisch der Preis Anzahl * Preis berechnet werden. Das Funktioniert auch im Prinzip, allerdings erst wenn man nochmal eine Zeile verändert/ Enter drückt. Ich nehme an ich muß irgendwie einen Listener oder so aufrufen nachdem die Zelle geändert wurde, so dass die ganze Zeile geupdatet wird. Aber ich weiß nicht wie, und auch nicht wo genau ich diesen Listener schreiben müsste.

Die beiden wichtigen Funktionen sehen so aus:


```
public Object getValueAt(int rowIndex, int columnIndex) {
		Artikel artikel = (Artikel)articels.get( rowIndex );
		//anzahlArtikel is ein Integer Vektor in dem die aktuelle Anzahl des jeweiligen Artikels gespeichert ist
int anzahl = anzahlArtikel.get(rowIndex);
	       
	      switch( columnIndex ){ 
	         case 0: return artikel.getName();
	         case 1: return new Double( artikel.getPreis() );
	         case 2: return anzahl;
	         case 3: return new Double ( anzahl * artikel.getPreis());
	         case 4: return new Double( artikel.getRabatt()*40 );
	         case 5: return new Double( anzahl * ( artikel.getPreis() - artikel.getPreis() * artikel.getRabatt() * 0.4 ) );
	         default: return null;
	      }
	}


public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		anzahlArtikel.set(rowIndex, (Integer)aValue);
	}
```


----------



## André Uhres (15. Nov 2007)

http://forum.java.sun.com/thread.jspa?forumID=57&threadID=566133


----------



## matzze2000 (15. Nov 2007)

Mhh, das hilft mir aber nur bedingt weiter weil ich das nich genauso machen kann wie in dem Beispiel, denn ich hab mein eigenenes TableModel und rufe das in ner anderen Klasse auf. Das Problem is außerdem, dass ich jetz noch nen Wert hab der außerhalb der Tabelle liegt und auf den in der Tabelle zugegriffen wird. Die von ihm Abhängigen Zellen ändern ihren Wert aber erst, nachdem ich eine andere Zelle angeklickt habe. Kann ich nicht irgend eine Funktion schreiben die wenn sie aufgerufen wird die Tabelle aktualisert?


----------



## André Uhres (15. Nov 2007)

Das geht mit jedem TableModel, das von AbstractTableModel abgeleitet ist,
also wohl auch mit deinem. Aktualisiert wird mit model.fireTableDataChanged();
oder model.fireTableChanged(..)


----------



## matzze2000 (15. Nov 2007)

Seltsam, wenn ich diese Funktion aufrufe ändern sich aber trotzdem nicht alle Zeilen sondern updaten sich immernoch nur dann, wenn ich die Zeile anklicke :-\

Hier is mal die Klasse mit der ich die Tabelle erstelle:


```
class Produkttabelle extends AbstractTableModel{
	GUI gui;
	private Vector articels = new Vector();
	private Vector<Integer> anzahlArtikel = new Vector<Integer>();
	private Vector listeners = new Vector();
	
	Produkttabelle(GUI gui) {this.gui = gui;}
	
	public void addArtikel( Artikel artikel ){ 
	      // Das wird der Index des Artikels werden 
	      int index = articels.size(); 
	      articels.add( artikel );
	      anzahlArtikel.add(0);
	       
	      // Jetzt werden alle Listeners benachrichtigt 
	       
	      // Zuerst ein Event, "neue Row an der Stelle index" herstellen 
	      TableModelEvent e = new TableModelEvent( this, index, index, 
	            TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT ); 
	       
	      // Nun das Event verschicken 
	      for( int i = 0, n = listeners.size(); i<n; i++ ){ 
	         ((TableModelListener)listeners.get( i )).tableChanged( e ); 
	      } 
	   }
	
	
	public void addTableModelListener(TableModelListener l) { 
	      listeners.add( l );
	   } 
	public void removeTableModelListener(TableModelListener l) { 
	      listeners.remove( l ); 
	   }

	public Class getColumnClass(int columnIndex) {
		switch( columnIndex ){ 
        	case 0: return String.class;
        	case 1: return Double.class;
        	case 2: return Integer.class;
        	case 3: return Double.class;
        	case 4: return Double.class;
        	case 5: return Double.class;
        	default: return null;
		}
	}
	
	public int getColumnCount() {
		return 6;
	}
	
	public String getColumnName(int column) {
		switch(column){
			case 0: return "Komponente";
			case 1: return "VK Liste";
			case 2: return "Auswahl";
			case 3: return "Endkundenpreis";
			case 4: return "Händlerrabatt (%)";
			case 5: return "Händlerpreis";
			default: return null;
		}
	}
	
	public int getRowCount() {
		return articels.size();
	}
	
	public Object getValueAt(int rowIndex, int columnIndex) {
		Artikel artikel = (Artikel)articels.get( rowIndex );
		int anzahl = anzahlArtikel.get(rowIndex);
	       
	      switch( columnIndex ){ 
	         case 0: return artikel.getName();
	         case 1: return new Double( artikel.getPreis() );
	         case 2: return anzahl;
	         case 3: return new Double ( anzahl * artikel.getPreis());
	         case 4: return new Double( artikel.getRabatt()* gui.rabattProzent );
	         case 5: return new Double( anzahl * ( artikel.getPreis() - artikel.getPreis() * artikel.getRabatt() * (gui.rabattProzent / 100) ) );
	         default: return null;
	      }
	}
	
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		if(columnIndex == 2) return true;
		else return false;
	}
	
	
	//Die Funktion wird ja aufgerufen nachdem ein neuer Wert eingetragen wurde und soll auch gleich die ganze Tabelle updaten
	
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		anzahlArtikel.set(rowIndex, (Integer)aValue);
		gesamtBetraege();
		gui.model.fireTableDataChanged();
	}
	
	public void gesamtBetraege(){
		//Erst den Kunden ausrechnen
		double betragKunde = 0, betragHaendler = 0;
		for(int i=0; i< articels.size(); i++){
			betragKunde += (Double)getValueAt(i, 3);
		}
		gui.gesamtKunde.setText("Endkundenpreis: " + betragKunde + "€");
		//Jetzt den Händler
		for(int i=0; i< articels.size(); i++){
			betragHaendler += (Double)getValueAt(i, 5);
		}
		gui.gesamtHaendler.setText("Händlerpreis: " + betragHaendler + "€");
		//Jetzt den Gewinn
		gui.gesamtGewinn.setText("Händlergewinn: " + (betragKunde - betragHaendler) + "€");
	}

	public void tableChanged(TableModelEvent e) {
		System.out.println(e.getSource());
		
	}
}
```


----------



## André Uhres (15. Nov 2007)

Um die Sache zu vereinfachen, hab ich hier die Artikeldaten alle in der Klasse "Artikel" untergebracht:
http://www.java-forum.org/de/userfiles/user3690/GUI.java


----------

