JTable und Model

SirWayne

Erfahrenes Mitglied
Hallo,
ich habe die Methode
Code:
 	public boolean isCellEditable(int row, int column) {
 		if (column == 1) {		
		 return true;
 			}
return super.isCellEditable(row, column);
 			}

überschrieben funktioniert auch wunderbar nur die 2te spalte ist editierbar ,aber wie lese ich den geänderten werd aus
tabelle.getValueat(); hat noch den alten wert
 
hier ist mal mein model vielleicht hat einer eine idee warum es nicht klappt

Code:
package studio.base;

import java.util.Vector;

import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;

public class MEDJTabellenModel extends AbstractTableModel  {

	Vector vData;
	Object[] oData;
	int col;
	String[]sColheads;
//	public MEDJTabellenModel(Vector data,String[] colheads)
//	{
//		super();
//		vData=data;
//		col=colheads.length;
//		sColheads=colheads;
//	}
	public MEDJTabellenModel(Object[] data,String[] colheads)
	{
		super();
		oData=data;
		col=colheads.length;
		sColheads=colheads;
		
	}
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return sColheads.length;
	}
	
	   public String getColumnName(int columnIndex)
	   {
	     return sColheads[columnIndex].toString();
	   }
	

	public int getRowCount() {
		
		if(oData==null)
		{
			return 0;
		}
		return oData.length;
	}

	public Object getValueAt(int row, int col) {
		// TODO Auto-generated method stub
		Object[] vRow=null;
		vRow =(Object[])oData[row];
		return vRow[col].toString();
	}
	
	  public void setValue(String value, int row, int col) 
	  {
		  //oData[2] = value;
		  super.setValueAt(value, row, col);
		  super.fireTableRowsUpdated(row,col);
		  super.fireTableStructureChanged();
	       super.fireTableCellUpdated(row, col);
	   }
	  
//	  public void setData(Vector data)
//	  {
//		vData=data;
//		fireTableStructureChanged();
//	  }

	  public void setData(Object[] data)
	  {
		oData=data;
		fireTableStructureChanged();
	  }
	  public  String[] getcolheads()
	  {
		 return sColheads; 
	  }
	  

	  
}
 
Moin!
Ich zitiere mal die Java Docu zu setValueAt() von AbstractTableModel
This empty implementation is provided so users don't have to implement this method if their data model is not editable.

Du rufst in deiner eigenen setValueAt() Methode aber genau diese leere Methode auf (super.setValueAt()). Ergo, du musst die Werte in deiner Datenstruktur schon selber setzen..

*grüssle*
MeinerEiner
 
mhm also ich habe es so versucht,aber sobald ich ´die zelle verlass steht der alte wert drin
Code:
public void setValueAt(String value, int row, int col) 
  { 
      Object[] vRow=null; 
      vRow =(Object[]) oData[row]; 
      vRow[col] = value; 
      super.fireTableCellUpdated(row, col); 
   }

die methode wird schon automatisch aufgerufen,wenn ich etwas in meiner zelle ändere oder muss ich sie selbst aufrufen?
 
>mhm also ich habe es so versucht,aber sobald ich ´die zelle verlass steht der alte wert drin

Weil Du nur auf einer lokalen Variable vRow arbeitest. Außerhalb von setValueAt ist sie weder sichtbar noch gültig.

>die methode wird schon automatisch aufgerufen,wenn ich etwas in meiner zelle ändere oder muss ich sie selbst aufrufen?

Sie wird automatisch aufgerufen.
 
Moin!
Ne, das würde schon so funktionieren, nur SirWayne, wenn du schon eine Methode überschreiben willst, dann solltest du auch auf deren Signatur achten
Es heißt NICHT

Code:
public void setValueAt(String value, int row, int col)
sondern
Code:
public void setValueAt(Object value, int row, int col)

*grüssle*
MeinerEiner
 
Oh stimmt, übersehen. Trotzdem sehe ich vRow noch immer als lokale Variable. Was soll es bringen, einer nur in der Methode sichtbaren und damit verwendbaren Variable etwas zuzuweisen?
 
Moin!
Probiers doch mal aus:
Code:
String[] data1 = {"1","2"};
String[] data2 = {"3","4"};
String[] data3 = {"5","6"};
Object[] data = {data1,data2,data3};
Object[] temp = (Object[])data[1];
temp[1] = "blabla";
temp = null;
System.out.println(((Object[])(data[1]))[0]);
System.out.println(((Object[])(data[1]))[1]);
Ausgabe

Es wird also nur eine Referenz erstellt. Änderungen die ich hier vornehme, beeinflussen also auch das "Original". Da kann wie bei SirWayne vRow gerne nur lokal sichtbar sein.. das beinflusst ja das "Original" nicht...

Zumindestmal reine ich mir das so zusammen. Lasse mich aber gerne korrigieren..

*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
MeinerEiner_80, ich glaube, wir reden aneinander vorbei. Betrachte bitte diesen Code:
Code:
public void setValueAt(String value, int row, int col) 
  { 
      Object[] vRow=null; 
      vRow =(Object[]) oData[row]; 
      vRow[col] = value; 
      super.fireTableCellUpdated(row, col); 
   }
Und dann erkläre mir bitte, wofür vRow gut sein soll.
 
Dann haben wir wohl wirklich aneinander vorbeigeredet..
wie gesagt, funktionieren tutst so oder so, aber ich schätze mal es ist übersichtlicher als
Code:
((Object[]) (oData[row]))[col] = value;
Zwischenschritte machen ,auch wenns nicht wirklich performant ist, ist doch wohl noch erlaubt, oder? ;)

Aber das muss SirWayne schließlich selber wissen, und solange es funktioniert ist das imho doch völlig wurscht..



*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Zurück