JTable - 2D ArrayList schreibt sich selber ins Table.

Shidan

Grünschnabel
Hallöchen, ich bins wieder.

Ja ich und meine Table. Ich hab sie nun so umgebaut das sie mit einer 2D ArrayList funktioniert.
Seltsamerweise tritt jetzt ein lustiger(naja nicht für mich) Fehler auf.

Der erste Start der Tabelle läuft wunderbar ,schreiben,löschen & speichern.
jetzt bekomme ich aber beim zweiten Start(Während die erste noch läuft) Total seltsame Werte aus dem Array undzwar die Liste ansich selber schreibt sich hinein.

Der Output wäre bei mir

Code:
OutPut 1:
1	2	3
1	2	3
1	2	3
Code:
OutPut2:
[1,2,3][1,2,3][1,2,3]
[1,2,3][1,2,3][1,2,3]
[1,2,3][1,2,3][1,2,3]


Wüsste jemand woran das liegen kann jetzt so auf den ersten Gedanken ?

Ich kann auch gerne noch mein Quelltext posten wenn man dannach fragt.

Grüße Shidan.
 
Zuletzt bearbeitet:
Also jetzt mal davon ausgehend das gerade niemand von uns eine funktionierende Glaskugel hat *meine ist zur Zeit in Reperatur* würde ich mal sagen : warum fragst du uns ob wir die helfen können und gibst uns dann nicht mal von dir aus Code sondern lässt dich von uns mit sowas hier dazu auffordern ? *Ich sage nur : Selbstinitiative*
 
Tschuldigung hätte eigentlich auch soweit denken können das das ohne Quelltext wohl unmöglich zu beantworten wäre.

Ich könnte hier mal meine Klasse reinschreiben inder ich die Tabelle umwandel vielleicht liegt es ja an dieser.
(Ist so ausführbar)

Sorry das war nur als Beispiel habe auch gerade erst gemerkt das Totaler Blödsinn war.


Hier mal meine Methode wie ich das einfache Array in eine 2D List verwandel.

(Ist so ausführbar)

Java:
/**
	 * Schreibt ein Array in eine 2D ArrayListe (String)
         * Format : x;x;x;x;x(Umbruch)
	 * @param data Zeile die um formatiert werden soll.
	 */
	public void table_to2D(String[] tabelle2){	
		int kalenderwochen = 0         // <--- Hier muss die Länge der gewollten SPALTEN hin.
		String[] tabelle = tabelle2;
		char[] x = new char[tabelle.length];
		int counter = 0;
		table2D = new ArrayList<ArrayList<String>>();
		

		for (int i = 0; i < tabelle.length; i++) {	
			table2D.add(i,new ArrayList<String>());		
			x = tabelle[i].toCharArray();	
			counter = 0;
			for (int j = 0; j <= kalenderwochen; j++) {	
				table2D.get(i).add(j,new String());		
				for (; counter < x.length;) {
					if(x[counter] != 59){	// Symbol ";"
						if(table2D.get(i).get(j).equals("")){								
							table2D.get(i).set(j,Character.toString(x[counter]));
						}else{
							table2D.get(i).set(j,table2D.get(i).get(j)+Character.toString(x[counter]));
						}
						counter++;
					}else{
						counter++;
						break;
					}
				}							
			}			
		}
		System.out.println("Table2d Size: " + table2D.size());
		System.out.println("Table Size: " + tabelle2.length);
		
		for (int i = 0; i < table2D.size(); i++) {		
			for (int j = table2D.get(i).size()-1; j > kalenderwochen; j--) {
				table2D.get(i).remove(j);
			}
		}
		
		for(int i = 0; i < table2D.size() ;i++){
			for (int j = 0; j < table2D.get(i).size(); j++) {
				System.out.print(table2D.get(i).get(j)+" ") ;
			}
			System.out.println();	
		System.out.println("-> :"+tabelle[i]);
		}
	}


Vielleicht noch alle Methoden die zusammhängend sind.

Save Methode : Liest alle Daten aus der Tabelle aus und schreibt sie wieder in das richtige Format.

Java:
	public void save(){
		int nAnzahlReihen = dtm.getRowCount();
		int nAnzahlSpalten = dtm.getColumnCount();
		String[] sTableDaten = new String[nAnzahlReihen];

		for(int i = 0; i < nAnzahlReihen; i++){
			for(int l = 0; l < nAnzahlSpalten; l++){
				if(tabellez.getValueAt(i, l) == null){	
					tabellez.setValueAt("", i, l);					
				}
				if(sTableDaten[i] != null)					
					sTableDaten[i] += tabellez.getValueAt(i,l).toString()+";";
				else
					sTableDaten[i] = tabellez.getValueAt(i,l).toString()+";";
								
			}		
			System.out.println();
		}
		c_initData.saveData(sTableDaten);
	}

SaveMethode2 : Bekommt das Array von s.o. und schreibt es in die Datei.

Java:
	/**
	 * Schreibt die Dateien die verändert wurden wieder in die Table.txt
	 * @param sInput TabellenArray für die Eingabe in die "table.txt"
	 */
	public void saveData(String[] sInput){	
		
		try {	
			URL tableURI;
			tableURI = res.getResource("./daten/table.txt");
			if(tableURI != null){
				String path  = tableURI.getPath().replaceAll("%20", " ");	
				File fNewFile = new File(path);
			
				//Löschen der File damit sie leer ist.
				fNewFile.delete();
				// Schreibt nun alle Daten aus sInput herüber.
				FileWriter writer = new FileWriter(fNewFile);
			
				for(int i = 0; i < sInput.length; i++){
					if(sInput[i] != null){
						writer.write(sInput[i]);
						writer.write(System.getProperty("line.separator"));	
					}else{
						writer.write("");
						writer.write(System.getProperty("line.separator"));	
					}				
				}	
				writer.flush();
				writer.close();	
			}else{
				System.err.println("Table nicht gefunden oder keine Rechte !");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}catch(NullPointerException e){
			e.printStackTrace();
		}
	}



Man sollte an die Methode ein Array im folgenden Format übergeben.
1;2;3;4;5;6;7 ( ; ist hierbei der Umbruch auf die neue Spalte im Array)
8;9;10;11;12;13 (Bei einer neuen Reihe startet er von Beginn).

Vielleicht liegt es ja an der Methode :|
 
Zuletzt bearbeitet:
Also hier mal ein zwei Vorschläge wie du deinen Code verbessern und besser lesbar machen könntest:
1. Statt dem umwandeln von String zu einem Char-Array und dann später den Char wieder zu einem String zu machen, nutze einfach die Funktion split. Damit kannst du anhand eines Zeichend ( bei dir ; ) splitten und erhälst ein String-Array der dazwischenliegenden Elemente! Damit wird auch z.B. counter überflüssig. Beispiel:
Java:
String quelle = "10;11;12"
String[] splitergebnis = quelle.split(";");
==>
Code:
Anzahl Elemente: 3
splitergebnis[0] = 10
splitergebnis[1] = 11
splitergebnis[2] = 12
2.
Java:
for (; counter < x.length;)
*Hände über dem Kopf zusammenschlag* Kennst du while-Schleifen? Aber dieser Punkt sollte mit Punkt 1 eh überflüssig werden...


Im übrigen ist das was du rausschreibst im Prinzip eine csv-Datei. Daher empfehle ich dir diese als auch als solche zu benennen. Dies hat den Vorteil, dass andere Programme, welche csv unterstützen (z.B. Excel) diese auch lesen können.

Mich interessiert stark, warum benötigst du eine 2d-ArrayList? Du erstellst aus den eingelesenen Daten doch nur eine JTable oder? Wenn das so ist würde ich eher diesen Weg bevorzugen (ungeachtet von deinen kalenderwochen, deren Bedeutung sich mir nicht erschließt):
Java:
//wichtig: hier musst du auf die Länge des Arrays achten, du kannst auch Daten in der Form rausschreiben: 1;2;3;;;; (4-7 sind leer)
defaulttablemodel.addRow(eingeleseneZeile.split(";"));
 
Zuletzt bearbeitet:
Okay danke für die Antwort, die Methode split sagte mir nichts wird mir aber vieles einfacher machen merke ich Gerade.
Mit der 2D ArrayList habe ich eine bessere Kontrolle über die Daten in der Tabelle da das Programm sich aus einer .propertie Datei die Daten holt die es zuletzt benutzt hat .
Darunter befindet sich die Kalenderwoche an dem das Programm das letze mal aufgerufen wurde und durch die 2D Liste ist es sehr einfach die überflüssigen Wochen nun zu löschen und das Programm wieder auf den neusten Stand zu bringen.
 

Neue Beiträge

Zurück