# AbstractTableModel



## StarSeven (19. Dez 2003)

Hallo,
ich habe ein Problem, ich verstehe das Abstract Table Model nicht.
Ich habe in einer Klasse meine JTable, und eine andre Klasse:

```
import javax.swing.table.AbstractTableModel;

public class AbstractModel extends AbstractTableModel
{	
	public int getRowCount()
	{
		return 10;		
	}	
	public int getColumnCount()
	{
		return 1;		
	}	
	public Object getValueAt(int row, int col)
	{
		//hier		
	}
}
```
Was muss darein wo "hier" steht und wie bekomme ich den Text in die Tabelle rein?
Und wie übergebe ich die public class AbstractModel extends AbstractTableModel in die Tabelle rein?
Hoffe ihr könnt mir helfen.
Mfg StarSeven


----------



## Ebenius (19. Dez 2003)

StarSeven hat gesagt.:
			
		

> Was muss darein wo "hier" steht und wie bekomme ich den Text in die Tabelle rein?


Da gibst Du mittels _return_ den Wert in Abhängigkeit zu _rowIndex_ und _columnIndex_ zurück. Die Tabelle stellt das dann dar.



			
				StarSeven hat gesagt.:
			
		

> Und wie übergebe ich die public class AbstractModel extends AbstractTableModel in die Tabelle rein?


Entweder (wenn die Tabelle erzeugt wird):
	
	
	
	





```
JTable table = new JTable(new AbstractModel());
```
 oder (wenn die Tabelle schon existiert):
	
	
	
	





```
table.setModel(new AbstractModel());
```

 :!: Allerdings ist der Name des TableModel's extrem schlecht gewählt, da es einfach mal nicht _abstract_ ist und auch wahrscheinlich nicht sein soll. (Ansonsten vergiss die beiden Code-Beispiele )

Es grüßt Ebenius


----------



## StarSeven (19. Dez 2003)

Ebenius hat gesagt.:
			
		

> :!: Allerdings ist der Name des TableModel's extrem schlecht gewählt, da es einfach mal nicht _abstract_ ist und auch wahrscheinlich nicht sein soll. (Ansonsten vergiss die beiden Code-Beispiele )
> 
> Es grüßt Ebenius


Also wenn ich dich richtig verstehe ist das AbstractTableModel nicht so praktisch für mich, oder wie meintest du das?
Wenn ja, ich wollte ja eigentlich nur eine normale JTable, leider konnte ich da nicht nur eine Spalte haben, und versuchte es deswegen mit dem Abstract Table Model, gibts eine leichtere (bessere) Lösung?


----------



## Ebenius (20. Dez 2003)

*AbstractModel:*


			
				StarSeven hat gesagt.:
			
		

> Also wenn ich dich richtig verstehe ist das AbstractTableModel nicht so praktisch für mich, oder wie meintest du das?


Das meinte ich nicht. Ich meinte, dass Dein *eigenes* (von _AbstractTableModel_ abgeleitetes) Model nicht "Abstract" im Namen führen sollte, da es nicht _abstract_ ist. Wollte nur sagen, dass der Name verwirrt.

*Table Model mit nur einer Spalte:*


			
				StarSeven hat gesagt.:
			
		

> ich wollte ja eigentlich nur eine normale JTable, leider konnte ich da nicht nur eine Spalte haben


Hmmm. Aber wenn das so aussieht, dann hast Du schlicht was falsch gemacht. Selbst das _DefaultTableModel_ kann das (Ich hab's extra nochmals probiert!):
	
	
	
	





```
JTable table = new JTable(new DefaultTableModel(
	new Object[][] { 
		{ "Some Data at Row 0 : Column 0" }, 
		{ "Some Data at Row 1 : Column 0" },
		{ "Some Data at Row 2 : Column 0" },
		{ "Some Data at Row 3 : Column 0" },
		{ "Some Data at Row 4 : Column 0" }
}, new String[] { "Column 0" }));
```

Es grüßt Ebenius


----------



## StarSeven (21. Dez 2003)

Also danke, klappt und ist viel einfacher ^^.
Aber nochmal eine Frage die vielleicht in Anfängerfragen sollte, bloß da wir gleich hier sind, WAS ist eigentlich abstrakt?


----------



## AlArenal (21. Dez 2003)

Eine abstrakte Klasse implementiert lediglich eine Schnittstelle. Die darin enthaltenen abstrakten Methoden sind leer und müssen dann in einer abgeleiteten Klasse implementiert werden.


----------



## Ebenius (21. Dez 2003)

Abstrakt ist eine Klasse dann, wenn sie als abstrakt deklariert wurde. Man deklariert eine Klasse abstrakt, um zu erreichen, dass Instanzen dieser Klasse nur über Ableitungen existieren. Dies will man beispielsweise wenn die Klasse nicht vollständig implementiert werden kann, da die Implementierung zu speziell würde. Die Implementierungen die noch fehlen werden den Ableitungen der abstrakten Klasse überlassen.

Das _AbstractTableModel_ ist zum Beispiel abstrakt, da zwar viele Methoden allgemeingültig implementiert werden können, jedoch letztendlich die konkreten Daten (siehe _getValueAt()_), die Spalten- und Zeilenanzahl (_getColumnCount()_, _getRowCount()_) von der speziellen Implementierung abhängen.

@StarSeven: Wenn Dir das nicht wirklich klar ist, fehlt Dir wahrscheinlich noch ein bisschen wissen über Objektorientierte Programmierung. Ein gutes Buch sollte dann helfen (auch online... Hyperlinks gibt's im Anfängerforum, such mal).

@AlArenal: Sorry, ich bin wieder kleinlich, aber abstrakte Klassen müssen keinen abstrakten Inhalt haben. (Im Gegensatz zu C++, wo sich eine abstrakte Klasse genau dadurch auszeichnet)

Es grüßt Ebenius


----------



## StarSeven (21. Dez 2003)

Ebenius hat gesagt.:
			
		

> @StarSeven: Wenn Dir das nicht wirklich klar ist, fehlt Dir wahrscheinlich noch ein bisschen wissen über Objektorientierte Programmierung. Ein gutes Buch sollte dann helfen (auch online... Hyperlinks gibt's im Anfängerforum, such mal).
> ...
> Es grüßt Ebenius


Jo, ich weiß, mit objektorientierte Programmierung habe ich noch meine Probleme, werde mal schauen ob ich da was finde was mir hilft.


----------



## AlArenal (21. Dez 2003)

Ebenius hat gesagt.:
			
		

> @AlArenal: Sorry, ich bin wieder kleinlich, aber abstrakte Klassen müssen keinen abstrakten Inhalt haben. (Im Gegensatz zu C++, wo sich eine abstrakte Klasse genau dadurch auszeichnet)



Bei mir stand bloß, dass eine Klasse als abstrakt deklariert werden muss, wenn wenigstens eine Methode der Klasse als abstrakt deklariert worden ist. 

Was soll denn an einer Klasse noch abstrakt sein, wenn es keine abstrakten Methoden gibt?




> abstract
> An formally unfinished class or method, marked with the keyword abstract. An abstact class is deliberatesly missing some or all of the method bodies. An abstract method is deliberately missing its method body. An abstract class is similar to an interface which is missing all the method bodies. An abstract class provides a base for someone to extend an actual class. You can't use new on abstract classes, but you can use abstract references, which always point to some extension of the abstract class. Interfaces are implicitly abstract as are alls their methods.


----------



## StarSeven (21. Dez 2003)

Also ich habe da dann doch nochmal eine Frage, erstmal hier der Quelltext:

```
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.io.File;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Var_help {

	public static void main(String args[]) {
		Var_help hilfe = new Var_help();
		hilfe.variablen();

	}

	public void variablen() {
		
		File f=new File("projekts\\"); 
		File[] files=f.listFiles();
		
		String names[]=new String[files.length];
		 
		for(int i=0;i<files.length;i++) 
		{ 
			names[i]=files[i].getName(); 
		} 
		
                               //hier
		for(int i=0;i<files.length;i++) 	                 
		{                                                               
			System.out.println(names[i]); 			
                                } 				
				
		JFrame mainFrame = new JFrame("Variablenhilfe");
		JPanel mainPanel = new JPanel();
		JTable jt_decision = new JTable(new DefaultTableModel( 
		new Object[][] 
		{ 		                                       
			{"Hier soll"},  
			{"eigentlich"},  
			{"nur der "},  			
                                                {"Inhalt von"},  
			{"names[] rein"}   
               		}, new String[] {"Projekte"}
		)	);

		JPanel menu = new JPanel();
		NewProjekt Jb_new = new NewProjekt();
		Laden jb_load = new Laden();
		Beenden jb_end = new Beenden();

		mainFrame.setSize(500, 300);
		mainFrame.setLocation(100, 100);
		
		mainFrame.getContentPane().add(mainPanel);
		mainPanel.setLayout(new BorderLayout());
				
		mainPanel.add(new JLabel("<html><head></head><body>[b]<u>Variablen-Hilfe-Programm[/b]</u></body></html>"), BorderLayout.NORTH);
		mainPanel.add(new JScrollPane(jt_decision), BorderLayout.CENTER);
		mainPanel.add(menu, BorderLayout.SOUTH);
		
		menu.setLayout(new FlowLayout());
		menu.add(Jb_new);
		menu.add(jb_load);
		menu.add(jb_end);
		
		mainFrame.setVisible(true);
	}

}
```

Da wo "hier" steht wird ja "names[]" in der Dos-Konsole ausgegeben, und genau das was ausgegeben wird soll auch in die Tabelle rein.
Da ich vorher aber nicht weiß wie viele Dateinamen "names[]" enthält weiß ich nicht wie ich der Tabelle sagen soll das sie den Inhalt von diesem String anzeigen soll.
Wie ist das möglich das die Tabelle den Inhalt von names[] anzeigt?


----------



## bygones (22. Dez 2003)

> Bei mir stand bloß, dass eine Klasse als abstrakt deklariert werden muss, wenn wenigstens eine Methode der Klasse als abstrakt deklariert worden ist.



meines wissens muss eine als abstract deklarierte klasse im grunde keine abstrakte methode besitzen !!



> Was soll denn an einer Klasse noch abstrakt sein, wenn es keine abstrakten Methoden gibt?



Man kann eine Klasse als abstract deklarieren, wenn man von ihr selbst keine Instanz bilden lassen will, sondern nur von deren Erben...


----------



## Ebenius (22. Dez 2003)

@deathbyaclown: Danke, genau das hätte ich geschrieben, wenn ich schnell genug gewesen wäre...

Sun Java Tutorial - Writing Abstract Classes and Methods

Es grüßt Ebenius


----------



## bygones (22. Dez 2003)

@Ebenius:  :lol:    :wink:


----------



## StarSeven (23. Dez 2003)

Also ich habe ja jetzt meine JTable welche das DefaultTableModel hat, un dem habe ich nun 2 Vectoren hinzugefügt, meine Entwicklungsumgebung (Eclipse) zeigt auch keinen Fehler an, aber ich kann es irgendwie nicht ausführen, wenn ich es ausführen will kommt immer die Meldung:

```
java.lang.ClassCastException: java.lang.String
	at javax.swing.table.DefaultTableModel.newRowsAdded(DefaultTableModel.java:270)
	at javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.java:215)
	at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:142)
	at Var_help.variablen(Var_help.java:42)
	at Var_help.main(Var_help.java:17)
```
Damit kann ich ehrlich gesagt aber nicht soviel anfangen, könnt ihr mir sagen, was diese Meldung mir sagen will^^.


----------



## Ebenius (24. Dez 2003)

Schau mal bitte in Deinem Code und unter JTable (_JTable (Vector, Vector)_), ob ich recht habe mit folgender Vermutung: Du hast den Data-Vector nicht mit Vektoren befüllt sondern mit Strings.



			
				API JTable hat gesagt.:
			
		

> The Vectors contained in rowData should contain the values for that row. In other words, the value of the cell at row 1, column 5 can be obtained with the following code:
> 
> ((Vector)rowData.elementAt(1)).elementAt(5);



Es grüßt (und wünscht frohe Weihnacht) Ebenius


----------



## StarSeven (24. Dez 2003)

Entweder ich habe das falsch verstanden, oder ich kann damit nicht das machen was ich möchte.
Damit kann ich (wie ich es verstanden habe) ja nur was in die Tabelle packen wenn ich weiß wieviele Elemente mein Vector enthält.
Ich aber habe das Problem das ich den die Namen aller Dateien in einem Ordner auslese, diese nacheinander in einer Schleife in einen Vector speicher (so hat der Vector dann z.B. den Inhalt:[Neu Textdatei.txt, Neu WordPad-Dokument.doc, Neu IrfanView BMP File.bmp, Default Projekt.txt]) und diese Dateien dann je in einer Zeile in die Tabelle packen möchte.
Deshalb weiß ich aber wie viele Elemente der Vector enthält da in diesem Ordner 0 - 999999999... Dateien schlummern können.
Ich hoffe das ich mein Problem einigermaßen verständlich geschildert habe.
Wenn ich das mit dem 
	
	
	
	





```
((Vector)rowData.elementAt(1)).elementAt(5);
```
 falsch verstanden habe sagt mir bitte bescheid (is ja schon spät, kann sein das meine Gehirnwindungen nichtmehr einwandfrei funktionieren).
Mfg StarSeven


----------



## StarSeven (25. Dez 2003)

Also ich habe es jetzt letztendlich doch noch hinbekommen.
Habe das AbstractTableModel benutzt, damit gings, hatte zwar erst nicht verstanden wie es funktioniert, es aber letztendlich doch noch kapiert.


----------

