# JTabels und das Hinzufügen von Zeilen mit Inhalt



## LordTerra (1. Aug 2007)

moin 

also dann mal was neues: 

ich habe folgenden Code: 

Table - Classe: 


```
class MyTableModel extends AbstractTableModel { 
        private String[] columnNames = {"Eigenschaft", "Wert"}; 
        
        private Object[][] data = LadeEigenschaften.Lade_Eigenschaften(); 

        public final Object[] longValues = {"", ""}; 

        public int getColumnCount() { 
            return columnNames.length; 
        } 

        public int getRowCount() { 
            return data.length; 
        } 

        public String getColumnName(int col) { 
            return columnNames[col]; 
        } 

        public Object getValueAt(int row, int col) { 
            return data[row][col]; 
        } 

        public Class getColumnClass(int c) { 
            return getValueAt(0, c).getClass(); 
        } 

        public boolean isCellEditable(int row, int col) { 
            if (col < 1) { 
                return false; 
            } else { 
                return true; 
            } 
        } 

        public void setValueAt(Object value, int row, int col) { 
            data[row][col] = value; 
            fireTableCellUpdated(row, col); 
        } 

    }
```
 


Iniziallisierung: 

```
JTable jTableEigenschaften = new JTable(new MyTableModel()); 
    MyTableModel model = (MyTableModel)jTableEigenschaften.getModel();
```




so also die Class wird also aufgerufen und auch angezeigt und es zeigt auch eine tabelle mit dem kopf: Eigenschaften | Wert 
und der 1. zeile aus "LadeEigenschaften.Lade_Eigenschaften()" richtig an... 

soweit sogut... 
jetzt möchte ich aber meiner tabelle noch folgende daten hinzufügen: 


```
Object rowData2[][] = {{"",""}, 
                         {"Objekt_ID",""+label_id}, 
                         {"Objekt",""+label_name}, 
                         {"Pos_X",""+akt_pos_x}, 
                         {"Pos_y",""+akt_pos_y}, 
                         {"Size_X",""+akt_size_x}, 
                         {"Size_Y",""+akt_size_y} 
                        };
```
 


und genau da scheitere ich ich versuch den mist seit 5 std zum laufen zu bekommen... hab mir duzende quellcodes im inet angeguckt undi ch werd immer noch net schlau... 

also ich weis ich muss 

```
fireTableRowsInserted
```
benutzen... 

aber wie hab ich ehrlich keinen plan... 
pls ich brauch hilfe!!! 

mfg LordTerra


----------



## SlaterB (1. Aug 2007)

du brauchst ein neues größeres data-Objekt, mit dem alten Inhalt + der neuen Zeile,

mit einer Liste statt Array könntest du einfach eine neue Zeile in die List einfügen,
z.B. List<Object[]>


--------

statt

JTable jTableEigenschaften = new JTable(new MyTableModel()); 
MyTableModel model = (MyTableModel)jTableEigenschaften.getModel(); 

schreibe lieber

MyTableModel model = new MyTableModel();
JTable jTableEigenschaften = new JTable(model);


----------



## LordTerra (1. Aug 2007)

SlaterB hat gesagt.:
			
		

> du brauchst ein neues größeres data-Objekt, mit dem alten Inhalt + der neuen Zeile,
> 
> mit einer Liste statt Array könntest du einfach eine neue Zeile in die List einfügen,
> z.B. List<Object[]>
> ...


----------



## SlaterB (1. Aug 2007)

feld ist ein Array von z.B. 15 Zeilen (eine Zeile ist ein Object[])
die 15 Zeilen könntest du einer nach der anderen in eine Liste einfügen,

so wie man jede Art von Objekte in eine Liste einfügt, was soll ich dazu sagen?

> und wie soll ich dann diese liste meiner tabelle adden?

die Liste ist nur dem Model bekannt, die Table interessiert sich nciht dafür, sie sieht nur das Model,

im Model würde die Liste das Object[][] ersetzen, alle Operationen würden ähnlich wie bisher drauf zugreifen


----------



## LordTerra (1. Aug 2007)

ja sorry hab listen noch nie verwendet... ich bin grad am rumbasteln das ich die überhaupt deklariert bekomm


----------



## LordTerra (1. Aug 2007)

```
public void add(Object value[][]) {
            Object zeile_zusammenbau[] = new Object [500];
        	List zeile = new ArrayList();
        	int flag=0;
        	for(int i=0;i<value.length; i++){
       			zeile_zusammenbau[i]=value[i];
 
        		zeile.add(zeile_zusammenbau[i]);
        	}        	 
        }
```

so hab jetzt also noch das dazu gebastelt... 

also jetzt hab ich eine liste mit den neuen daten... 
wie bastel ich die jetzt zu meiner bestehenden tabelle?


----------



## SlaterB (1. Aug 2007)

genau andersrum...

die neuen Daten (falls du damit eine Zeile meinst) sind keine Liste, sondern bleiben ein Object[],
und die bestehende Tabelle ist die List, und da einfach einfügen

wieso sind die bei dir die neuen Daten Object[][]? eine Zeile kann nur ein Object[] sein,
was soll da drinstehen, was soll das sein?
wenn das die kompletten Daten der Tabelle sind, dann dein altes Feld damit überschreiben


was soll das Object[] der Länge 500 sein?
du musst schon jedem Objekt in deinem Programm einen Sinn zuordnen, sonst versteht das keiner

ich sehe das wie folgt:
wenn die Tabelle 7 Spalten hat, dann ist eine Zeile ein Object[7],

wenn man 15 Zeilen hat,
dann muss man die alle 15 speichern, z.B. in einem Object[15][7] 
oder in einer Liste<Object[]>, die 15 Zeilen, also 15x ein Object[7] enthält

wenn du eine neue Zeile einfügen willst, dann machst du 
add(Object[]], also add Object[7], und das fügst du einfach in die Liste ein, die dann 16 statt 15 Zeilen enthält

oder aber du verwendest das Object[][], dann brauchst du aber ein größeres Array [16][7], damit alle 16 Zeilen reinpassen


----------



## LordTerra (1. Aug 2007)

also die 500 sind einfach eine fiktive größe

aber efektiv hab ich eine tabelle 

eigenschaft | wert 
eigenschaft | wert 
eigenschaft | wert 
eigenschaft | wert 
eigenschaft | wert 
eigenschaft | wert 
eigenschaft | wert 
eigenschaft | wert 

.
.
.

z.b. :


```
Object rowData2[][] = {{"",""},
	    					   {"Objekt_ID",""+label_id},
	    					   {"Objekt",""+label_name},
	    					   {"Pos_X",""+akt_pos_x},
	    					   {"Pos_y",""+akt_pos_y},
	    					   {"Size_X",""+akt_size_x},
	    					   {"Size_Y",""+akt_size_y}
	    					  };
```

daher das 2d feld... 

und wenn ich dich richtig verstanden hab muss ich jetzt nur bevor ich 


```
zeile.add(zeile_zusammenbau[i]);
```

mach noch die bisherrigen zeilen adden?


----------



## SlaterB (1. Aug 2007)

ich weiß nicht was zeile_zusammenbau ist
ich weiß nicht was zeile ist
ich weiß immer noch nicht was rowData2 ist, ob das nun 6 neue Zeilen sind, eine neue Zeile oder die komplette neue Tabelle


----------



## LordTerra (1. Aug 2007)

irgendwie hast du meinen quellcode net wirklich verstanden...

ich habe keine 500 spalten sondern 500 zeilen... 
und ich hab genau 2 spalten... 


zeile_zusammenbau = 1 von den 500 zeilen
zeile = liste von neuen zeilen

und wie gesagt es sind 500 neue zeilen bestehend aus 2 elementen ner eigenschaft und nem wert


----------



## SlaterB (1. Aug 2007)

> zeile_zusammenbau = 1 von den 500 zeilen 
zeile_zusammenbau ist (oder war zumindest oben) ein Object[500],
wie kann dieses riesige Objekt eine von den 500 Zeilen sein?
vielleicht meinst du

zeile_zusammenbau_ = 1 von den 500 zeilen 

was aber immer noch nicht besonders viel erklärt,
denn zeile_zusammenbau ist ein eindimesionales Array,
kann also nur einzelne Objekte enthalten, wie soll da eine Zeile bestehend aus zwei Objekten rein?

> zeile = liste von neuen zeilen 

welchen Sinn hat es, eine Liste von neuen Zeilen zu erstellen?
davon habe ich nie geredet,
ich meinte immer nur, dass es eine Liste mit allen Zeilen der Tabelle gibt,
und dass man in diese Gesamtliste neue Zeilen einfügen kann_


----------



## LordTerra (1. Aug 2007)

alter..... 

1. is doch scheiss egal wie groß das feld is das ding is nen zwischenspeicher den ich noch von ner anderen idee drin hatte ich kann den auch komplett raus lassen... 


```
public void add(Object value[][]) {
    	List zeile = new ArrayList();
        	for(int i=0;i<value.length; i++){
        		zeile.add(value[i]);
        		System.out.println(zeile);
        	}        	 
        }
```

^^ das geht genauso gut... sorry aber wie kann man sich an so nem kram aufhängen???


und in value_ steht nun sowas wie = {"Pos_y",""+akt_pos_y},  drin, bzw der zeiger auf die stelle 

und in zeile hab ich nun nen array von zeigern die auf die neuen zeilen verweisen...
das problem was ich hab is einfach das ich diese liste jetzt der tabelle zuweisen will und net weis wie..._


----------



## SlaterB (1. Aug 2007)

du hast dieses unverständliche und überflüssige Array eingeführt, das nun komplett verschwindet,
sollte ich das in meinen Gedanken komplett ausklammern?
du musst schon sagen, was ich alles ausklammern soll 

gut, dass das weg ist,
bleibt noch 'zeile', welches, wie gesagt, in meinem Auge genauso überflüssig ist,
was hilft dir eine Liste der neuen Zeilen? gar nix,
füge die Zeilen direkt in die Liste ALLER Zeilen ein,
fireTableXYWasWeißIch();
und fertig,
ganz einfach


----------



## LordTerra (1. Aug 2007)

ja und genau da liegt mein problem... 
von mir aus mach ich auch noch die liste weg aber wie 
weis ich nun meiner vorhanden tabel was zu 


```
fireTableRowsInserted

public void fireTableRowsInserted(int firstRow,
                                  int lastRow)
```

das versteh ich ja eben net... 

ich hab values_ die an meine tabelle angehängt werden soll ... 
und bei der einzigsten funktion die sowas laut definition macht muss man keine neuen daten angeben sondern nur ne 1. und letzte zeile... 

wo nimmt sich java denn die daten her bzw weis es das es values nehmen soll ?
und was zählt als 1. bzw letzte zeile???_


----------



## SlaterB (1. Aug 2007)

wenn dein Tabelle schon 70 Zeilen hat und du 4 neue einfügst,
dann ist es in der Einfüge-Operation doch leicht zu berechnen,
dass du am Ende
fireTableRowsInserted(70,74); 
aufrufen musst, was ist daran schwer? du kennst du Größe der Tabelle und die Anzahl der neu eingefügten Zeilen

-------------

> aber wie weis ich nun meiner vorhanden tabel was zu 

da warst du schon am Anfang und ich sagte:
entweder
private Object[][] data
vergrößern und darin die neuen Zeilen einfügen 
(und die alten übernehmen, du bräuchtest ein neues Array)

oder eine Liste an Stelle von data verwenden und in diese Liste einfach einfügen,


----------



## LordTerra (1. Aug 2007)

ja und genau den letztenm teil deiner antwort versteh ich net... 

kannst du net einfach mal fix den quellcode hinschrieben das ich das seh wie du das meinst ? ab besten mir dem vergrößerten object[][]


----------



## SlaterB (1. Aug 2007)

programmieren musst du selber, ich verrate schon viel zu viel, ungefähr

```
Object[][] oldData = data;
int alteLaenge = ..;
data = new Object[alteLaenge +neueZeilen][2];
for (i < alteLaenge ) {
  data[i] = oldData[i];
}
for (i < neueZeilen) {
  data[alteLaege+i] = neueData[i];
}
```


----------



## LordTerra (1. Aug 2007)

```
public void add(Object value[][]) {
        	int neueZeilen=0;
        	for(int i=0;i<value.length; i++){
    			neueZeilen++;
        		if(value[i]==null){
        			break;
        		}
        	}        	 
        	
        	Object[][] oldData = data; 
        	int alteLaenge = data.length; 
        	data = new Object[alteLaenge +neueZeilen][2]; 
        	for (int i=0; i < alteLaenge; i++ ) { 
        	  data[i] = oldData[i]; 
        	} 
        	for (int i=0; i < neueZeilen; i++) { 
        	  data[alteLaenge+i] = value[i]; 
        	} 
        	fireTableRowsInserted(alteLaenge, alteLaenge+neueZeilen);	

        }
```


man mags kaum glaubes  es ist vollbracht  
thx ...


----------

