Na ja da du es mit readLine bei dir nur Zeilenweise einlesen kannst, so könntest du den eingelesenen Zeilen String editieren. Wandel den String in ein Char[] um und geh zeichen für Zeichen durch bis du bei deinem Trennzeichen angekommen bist zB der Tabulator. Bist du bei ihm angekommen, so haste die Infos in Spalte 1. Und dann das ganze 5 mal.
Na ja da du es mit readLine bei dir nur Zeilenweise einlesen kannst, so könntest du den eingelesenen Zeilen String editieren. Wandel den String in ein Char[] um und geh zeichen für Zeichen durch bis du bei deinem Trennzeichen angekommen bist zB der Tabulator. Bist du bei ihm angekommen, so haste die Infos in Spalte 1. Und dann das ganze 5 mal.
Es ist doch so: In Java muss ich leider wenn ich ein array erstelle dieses mit Werten initialisieren, d.h. zum Zeitpunkt der Erstellung des arrays muss ich bereits herausgefunden haben wie viele zeilen und spalten das 2D Array haben wird letztendlich. Das bekomme ich nur heraus indem ich:
Zeilen: Die .txt Datei komplett ein durchlese und anhand meiner variable "counter" jedesmal mitzähle.
Spalten: Dies sind fest 5 Spalten daran ändert sich auch nichts, wobei ich die Anzahl der Spalten auch feststellen könnte mit:
String[] userinformation = line.split("\\;");
dann mit userinformation.length; bekämme ich die Anzahl der Spalten ja sogar alle 5 einzelnen werte, hm split trennt ja automatisch die komma getrennten werte und liest diese nur in ein 1D array was schon schlecht ist, wären dann ein StringTokenizer nicht besser? Na wie gut dass ich über die Klasse mal ne Powerpoint präsentation machte gleich mal rauskramen ;-)
oder habt ihr einen besseren Vorschlag? Um erst mal zu testen in ein 2dArray einzulesen habe ich fiktive array werte genommen für die Zeilenanzahl wie 1000, da die Zeilen in der .txt datei nie darüber liegen(werden).
Na ja zum problem, dass bei new Array[length] es fixtiv ist, so stimmt das schon. Du hast eigentlich nur 2 Möglichkeiten. Etwa du nutzt eine ander Klasse wie Vector (java.util.Vector), wo die größe Variable ist und es schon schöne methoden dazu gibt. Nachteil daran ist aber, dass das Durchlaufen länger dauert (bei großer Füllmenge merkt man das dann schon bisschen).
ODER
Du schreibst dir eine methode, die dein array erweitert. D.h. ist das array voll und bei zB 1000 angelangt, so schreibt die methode ein neues array und kopiert die alten Werte.
die Zeichenketten aus der text datei werden in das 2d array geschrieben und zum test danach sofort wieder mit System.out.println wieder ausgegeben, fehlt nix ... ABER diese DAten müssen in eine Tabelle eingelesen werden und die Tabelle:
Code:
TableModel dimension = new DefaultTableModel (zeilenwert,spaltenwert);
wird im Konstruktor erstellt und WILL eine zeilen/spaltenangabe. Doch zum Zeitpunkt des Konstruktors hat der User über die GUI noch gar nicht die Datei ausgewählt die er einlesen möchte in das 2darray und dann in die tabelle, wie kann ich dann auf die tabelle zugreifen und ihr die werte übergeben aus meinem 2d array ???
Code:
try
{
BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(absolutePath)));
String[][] myArray = new String [1000][5]; //Mehr als 1000 Zeilen/Personendaten wirds nicht geben und 5 spalten maximal sind vorgegeben
String line;
int zeile=0; //2D Array Zeilen
int anzahlToken; //2D Array Spalten
while((line = file.readLine())!= null )
{
mytokenizer = new StringTokenizer (line,";");
anzahlToken = mytokenizer.countTokens();
for(int i=0; i < anzahlToken; i++)
{
myArray [zeile][i] = mytokenizer.nextToken();
System.out.println(myArray[zeile][i]);
}
zeile++;
}
benutzeranzahlTF.setText(String.valueOf(zeile));
file.close();
}
catch (Exception e)
{
e.printStackTrace();
}
TableModel dm = new DefaultTableModel (tabellendaten,spaltennamen);
JTable tabelle = new JTable (dm);
die Methode, welche die .txt Datei öffnet und die Daten in Zeilenweise in ein 2DArray einliest und in obiges 2DArray "tabellendaten" kopiert mit der clone(); methode:
Code:
try
{
BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(absolutePath)));
String[][] myArray = new String [1000][5]; //Mehr als 1000 Zeilen/Personendaten wirds nicht geben und 5 spalten maximal sind vorgegeben
String line;
int zeile=0; //2D Array Zeilen
int anzahlToken; //2D Array Spalten
while((line = file.readLine())!= null )
{
mytokenizer = new StringTokenizer (line,";");
anzahlToken = mytokenizer.countTokens();
for(int i=0; i < anzahlToken; i++)
{
myArray [zeile][i] = mytokenizer.nextToken();
System.out.println(myArray[zeile][i]);
}
zeile++;
}
tabellendaten = myArray.clone();
<-- ACHTUNG: Die Daten aus myArray in das tabellendaten-Array geclont/kopiert hat keine Auswirkung auf die GUI ??? Liegt das an dem fehlenden "refresh" oder weil ich die clone Methode falsch anwende, wobei keine Fehlermeldung kommt... ??
Die Daten stimmen immer überein aber die GUI wird nicht neu upgedated...
Die Klasse hat den
Code:
public class MainWindow extends JFrame implements ActionListener, TableModelListener
und Konstruktor:
Code:
tabelle.getModel().addTableModelListener(this);
und eine Methode:
Code:
public void tableChanged(TableModelEvent e) // sobald daten in die tabellen-gui geschrieben werden kann ich hier
{
System.out.println("Veränderung wurde gemacht!");
}
wobei die methode tableChanged ja nur dafür ist wenn eine spalte/zeile in der tabelle verändert wurde. Ich will aber einen kompletten repaint/initialisierung der JTable da sie ja neue Daten von der myArray.clone() methode bekommen hat und da bringt
AbstractTableModel dm; habe ich nun gemacht um an die
dm.fireTableStructureChanged(); methode zu kommen oder die dm.fireTableDataChanged(); die ja in meinem Fall die Richtige ist.
Das witzige... ist wenn ich die fireTableDataChanged() methode aufrufe nachdem dem tabellendaten = myArray.clone();
müsste die Tabelle ja eigentlich die neue Daten anzeigen tut sie aber nicht... Wenn ich die fireTableStructureChanged(); methode aufrufe dafür die Tabelle neugezeichnet sprich es passiert ja was...
Doch wie kommen eigentlich die Daten in das JTable hinein?
1. Möglichkeit - 2d Array
Diese Methode ist sehr statisch, es ist später nicht mehr gut möglich, Daten zu ändern.
2. 2. Möglichkeit - Vectoren Mit ineinander gesetzten Vektoren:
doch auch hier gilt: nachdem das JTable initialisiert wurde, kann man nichts mehr verändern.
äh wenn ich Daten in einem 2DArray habe die erst in das 2DArray eingelesen werden, nachdem die JTable instanz initialisiert wurde, wie oder mit was bekomme ich dann die Daten in eine JTable so dass diese auch visuell dargestellt werden?
3. Möglichkeit - DefaultTableModel
Mit einem DefaultTableModel.
Ein DefaultTableModel kann man sich auch als 2-dimensionalen Array vorstellen
Das heißt für mich jetzt ich lese mein .txt zeilen/spalten zeichenketten in eine DefaultTableModel instanz und nicht in ein String[][] array sehe ich das richtig?
Könnte jemand bitte antworten, damit das hier nicht zum Monolog gebrabbel wird danke!