AbstractTableModel

Status
Nicht offen für weitere Antworten.

StarSeven

Bekanntes Mitglied
Hallo,
ich habe ein Problem, ich verstehe das Abstract Table Model nicht.
Ich habe in einer Klasse meine JTable, und eine andre Klasse:
Code:
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

Top Contributor
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):
Code:
JTable table = new JTable(new AbstractModel());
oder (wenn die Tabelle schon existiert):
Code:
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

Bekanntes Mitglied
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

Top Contributor
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!):
Code:
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

Bekanntes Mitglied
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

Top Contributor
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
Also ich habe da dann doch nochmal eine Frage, erstmal hier der Quelltext:
Code:
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?
 
B

bygones

Gast
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...
 

StarSeven

Bekanntes Mitglied
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:
Code:
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

Top Contributor
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

Bekanntes Mitglied
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
Code:
((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

Bekanntes Mitglied
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zeppi Swing AbstractTableModel AWT, Swing, JavaFX & SWT 9
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
N JTable, AbstractTableModel aus Datenbank initialisieren AWT, Swing, JavaFX & SWT 8
I JTable,AbstractTableModel Problem AWT, Swing, JavaFX & SWT 3
I JTable und AbstractTableModel AWT, Swing, JavaFX & SWT 10
H JTable - DefaultTableModel vs AbstractTableModel AWT, Swing, JavaFX & SWT 5
O Swing AbstractTableModel - Observer.. AWT, Swing, JavaFX & SWT 14
K Swing jTable und AbstractTableModel AWT, Swing, JavaFX & SWT 6
Ollek Swing JTable - Zeile löschen mit AbstractTableModel AWT, Swing, JavaFX & SWT 20
B Swing AbstractTableModel rows verschieben AWT, Swing, JavaFX & SWT 2
M Swing JComboBox im AbstractTableModel AWT, Swing, JavaFX & SWT 8
H Markierte Zeile löschen AbstractTableModel AWT, Swing, JavaFX & SWT 10
K JTable & AbstractTableModel AWT, Swing, JavaFX & SWT 9
G Problem mit AbstractTableModel und JComboBox AWT, Swing, JavaFX & SWT 8
P Eigenes TableModel abgeleitet von AbstractTableModel (neue rows nicht sichtbar) AWT, Swing, JavaFX & SWT 6
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3
G AbstractTableModel kopieren AWT, Swing, JavaFX & SWT 4
G JTable (AbstractTableModel) wird nicht aktualisiert AWT, Swing, JavaFX & SWT 2
F AbstractTableModel + Vector - Wie Zeile hinzufügen AWT, Swing, JavaFX & SWT 4
D JTable, DefaultTableCellRenderer & AbstractTableModel AWT, Swing, JavaFX & SWT 11
N JTable repaint mit AbstractTableModel AWT, Swing, JavaFX & SWT 2
B jTabel, MVC und AbstractTableModel AWT, Swing, JavaFX & SWT 6
M Wann AbstractTableModel und wann DefaultTableModel AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben