WinFuture-Forum.de: Tablemodel Datenauslesen? - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Tablemodel Datenauslesen?


#1 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 02. November 2009 - 09:01

Ich Habe ein Tablemodel, welches im laufe des Programmes mit Daten gefüllt wird (also Text).
Ich möchte, dass die Daten über einen "Laden" Button geladen werden, denn wenn ich das Programm schließe, sind die Daten ja wieder weg. So soll es natürlich auch ein "Save"-Button geben.

Einen "Lade-Button" habe ich bereits- er funktioniert auch, aber die Daten habe ich Manuell Zeilenweise in eine Datei geschrieben. Meine Save-Methode fehlt mir, da ich nicht weiß wie ich mir die Daten aus der Model hohle...
Außerdem: Wie kann ich die aktuell makierte Zeile auslesen?

Hier mal mein Loadcode:

public void load()throws Exception{
		   //Zeilenweise auslesen
	BufferedReader br = new BufferedReader(new FileReader("datcup"));

	String line;

	while ((line = br.readLine()) != null) {
	  Object[] temp2 = {line};

   model.insertRow(0, temp2);

	}
	br.close();
  }


Ich habe eine Möglichkeit gefunden, Eingaben in eine .txt zu speichern. Aber wie mache ich das, das diese Eingabe immer weider unten angehangen wird, und nicht immer die 1. Zeile überschreibt?

Dieser Beitrag wurde von driv3r bearbeitet: 02. November 2009 - 10:23

0

Anzeige



#2 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 02. November 2009 - 12:29

Man kann ja über Java denken was man will, aber die Dokumentation ist wirklich gut.

Zitat

Meine Save-Methode fehlt mir, da ich nicht weiß wie ich mir die Daten aus der Model hohle...

Es geht auf jeden Fall mit getValueAt(), als Parameter gibt man Zeile und Spalte an und kriegt ein Objekt zurück. Das castet man noch in den richtigen Typ (z.B. String) und das war's dann auch schon.

Zitat

Außerdem: Wie kann ich die aktuell makierte Zeile auslesen?

Mit getSelectedRow() bzw. getSelectedRows(). Ersteres liefert die erste markierte Zeile zurück und letzteres ein Array mit allen markierten Zeilen (sofern vom TableModel erlaubt).

Zitat

Ich habe eine Möglichkeit gefunden, Eingaben in eine .txt zu speichern. Aber wie mache ich das, das diese Eingabe immer weider unten angehangen wird, und nicht immer die 1. Zeile überschreibt?

Auch da hilft ein Blick in die API. In Deinem Beispiel verwendest Du insertRow(), um eine neue Zeile einzufügen. Der erste Parameter gibt dabei den Index an, an dem die Zeile eingefügt werden soll - also am Anfang. Fürs Anfügen am Ende eignet sich addRow() besser.
Hoppla, ich sehe gerade, daß doch eher das Schreiben in eine Datei gemeint ist, richtig? Dafür gibt's i.d.R. eine append() Methode.
0

#3 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 03. November 2009 - 09:32

Thx Mr. Floppy - das hilft mir schonmal ein bischen.

Doch da habe ich wohl zu einfach gedacht.^^

Wofür das auslesen der Makierten Zelle: Ich habe einen "Löschen-Button" der die Zeile dann löschen soll.
mit
model.removeRow(0);
geht es ja soweit. Jetzt habe ich gedacht es könnte so funktionieren:
model.removeRow(getSelectedRow());
Der Parameter muss ja anscheint ein Int sein. Wie kann ich das jetzt am besten lösen?

--
Den Rest habe ich noch nicht ausprobiert. Das kommt dann als nächstes...
0

#4 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 03. November 2009 - 11:15

Zitat

Der Parameter muss ja anscheint ein Int sein. Wie kann ich das jetzt am besten lösen?

Du mußt getSelectedRow() für das entsprechende Objekt aufrufen. Etwa so:
model.removeRow(myTable.getSelectedRow());

Ein try/catch ringsrum kann auch nicht schaden, weil getSelectedRow() auch -1 zurückliefern kann, wenn nichts ausgewählt ist. Eleganter wäre es natürlich, wenn Du den Lösch-Button nur aktivierst, wenn auch was ausgewählt ist.
0

#5 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 03. November 2009 - 16:24

ahh ok hat funktioniert. Dabei habe ich aber noch ein anderes Problem:

String[] text = {jTable1.getValueAt(0,0).toString()};

"text" wird dann in die Datei geschrieben. Wie angegeben wird aber nur die 0. Zeile geschrieben.

String[] text = {jTable1.getValueAt(0,1).toString()};
Das funktioniert nicht mehr... Woran kann das liegen? Beim Speichern gibt er mit die Felermeldung aus, die ich bei catch definiert habe.
Mein Model ist so eingestellt, das er immer oben eine neue Zeile anhängt wenn ich etwas hinzufüge.. (falls das relevant ist)
0

#6 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 03. November 2009 - 17:31

Ich sehe da zwei Probleme. Mit
String[] text = {jTable1.getValueAt(0,0).toString()};

enthält text am Ende ein Element in dem der Text aus dem Feld 0,0 steht. So weit, so gut. Wenn Du das mit den folgenden Zeilen auch so machst, wird das Array immer wieder überschrieben. Am Ende steht also maximal der letzte String der Tabelle drin. Du müßtest für jede neue Zuweisung/Zeile den Index erhöhen oder die entsprechende Array Methode (dürfte auch append() sein) nutzen. Dann kannst Du auch die geschweiften Klammern weglassen, die machen in Deinem Beispiel nämlich aus dem String ein einelementiges Array. Das
String[] text = {jTable1.getValueAt(0,1).toString()};

eine Exception wirft, verwundert kaum, weil 0 für die Zeile und 1 für die Spalte steht!

Dieser Beitrag wurde von Mr. Floppy bearbeitet: 03. November 2009 - 17:32

0

#7 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 04. November 2009 - 09:02

Ok, mal angenommen ich würde es erstmal so lassen und das für jede Zeile einzeln einfügen und immer um 1 erhöhen -

String[] text = {jTable1.getValueAt(1,0).toString()};

Bei diesem Beispiel funktioniert es genauso wenig... Warum?

Gibt es vll eine einfache vll alternatvie Lösung? Falls ja wie genau ist das Umzusetzten? (append?)

Zum Verständniss hier mal ein Ausschinitt: Ich gebe was in die Zeile ein, klicke auf Neu und es bildet sich eine neue Zeile mit dem Inhalt. Ich möchte am ende alle eingegebenen Zeilen irgentwie speichern, sodass ich diese beim nächsten Programmstart wieder aufrufen kann.

Eingefügtes Bild

(- Habe hier also einmal "Hallo" erstellt und einmal einfach nur auf "Neu" geklickt.)

Dieser Beitrag wurde von driv3r bearbeitet: 04. November 2009 - 10:43

0

#8 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 04. November 2009 - 10:59

Zitat

String[] text = {jTable1.getValueAt(1,0).toString()};

Bei diesem Beispiel funktioniert es genauso wenig... Warum?

Weil Du wieder den selben Fehler machst :angry: Ich schreib's mal in "Pseudocode" auf, weil ich schon lange nichts mehr mit Java gemacht habe:
for(int i = 0; i < jTable1.getNumOfRows(); i++)
{
  text[i] = jTable1.getValueAt(i,0).toString();
  // oder mit append (nur eins von beiden nehmen!)
  text.append(jTable1.getValueAt(i,0).toString());
}

Dieser Beitrag wurde von Mr. Floppy bearbeitet: 04. November 2009 - 11:05

0

#9 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 04. November 2009 - 11:06

Arrays sind allerdings nicht dynamisch, das heißt die Ausgangsgröße muss bekannt sein. Besser ist hier wenn du mit einer Liste, konkret ArrayList arbeitest:
final List<String> text = new ArrayList<String>();

for(int i = 0; i < jTable1.getNumOfRows(); i++) {
	text.add(jTable1.getValueAt(i,0).toString());
}


Wenn getValueAt allerdings auch Null zurückliefern kann, wird das über kurz oder lang zu einer NPE führen.
0

#10 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 04. November 2009 - 13:36

ok, selbst wenn ich das mit dem (i, 0) versuche funktioniert es irgentwie nicht - oder zumindest bin ich keinen schritt weiter....

Jetzt wollte ich mal Witi's Code versuchen, so sieht meine Save-Methode wie folgt aus:

Zitat

public void save() throws Exception{

File file = new File("datcup");
BufferedWriter bw = new BufferedWriter(new FileWriter(file));

final List<String> text = new ArrayList<String>();

for(int i = 0; i < jTable1.getNumOfRows(); i++) {
text.add(jTable1.getValueAt(i,0).toString());

bw.write(text[i]);
bw.newLine();

}
bw.flush();
bw.close();


}


und das kommt dabei raus:

Zitat

public class FileReadWriteExample {
^
1 error

Compiliere D:\Dokumente\Java\Editor Projekte\Jtermin01.java mit Java-Compiler
Jtermin01.java:294:17: type java.awt.List does not take parameters
final List<String> text = new ArrayList<String>();
^
Jtermin01.java:294:37: cannot find symbol
symbol : class ArrayList
location: class Jtermin01
final List<String> text = new ArrayList<String>();
^
Jtermin01.java:296:27: cannot find symbol
symbol : method getNumberOfRows()
location: class javax.swing.JTable
for(int i = 0; i < jTable1.getNumberOfRows(); i++) {
^
3 errors


Was habe ich falsch gemacht? Bevor das noch mehr Chaos gibt, hier nochmal meine funktionierende Methode die immer nur 1 Zeile schreibt:

Zitat

public void save() throws Exception{
File file = new File("datcup");
BufferedWriter bw = new BufferedWriter(new FileWriter(file));

String[] text = {jTable1.getValueAt(i,0).toString()};
for (int i = 0; i < text.length; i++) {

bw.write(text[i]);
bw.newLine();
}
bw.flush();
bw.close();
}


Wie müsste diese Methode aussehen, dass er die Gesamte Table in die Datei schreibt... Wenn ich nochmal auf Speichern klicke kann ja wieder alles überschrieben werden...
0

#11 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 04. November 2009 - 14:04

nicht "java.awt.List", sondern "java.util.List". Aber für deinen Zweck benötigst du sie noch nicht mal. So funktioniert es:
	public void save() throws Exception {
		File file = new File("datcup");
		Writer fileWriter = null;
		BufferedWriter bw = null;

		try {
			fileWriter = new FileWriter(file);
			bw = new BufferedWriter(fileWriter);

			for (int i = 0; i < jTable1.getNumOfRows(); i++) {
				Object value = jTable1.getValueAt(i, 0);

				if (value != null) {
					bw.write(value.toString());
					bw.newLine();
				}
			}

			bw.flush();
		} finally {
			if (fileWriter != null) {
				fileWriter.close();
				fileWriter = null;
			}

			if (bw != null) {
				bw.close();
				bw = null;
			}
		}
	}

0

#12 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 04. November 2009 - 14:44

Ich habe dein Code einfach übernommen- das Ergebnis:

Zitat

Datei1.java:19:8: class FileReadWriteExample is public, should be declared in a file named FileReadWriteExample.java
public class FileReadWriteExample {
^
1 error

Compiliere D:\Dokumente\Java\Editor Projekte\Jtermin01.java mit Java-Compiler
Jtermin01.java:305:9: cannot find symbol
symbol : class Writer
location: class Jtermin01
Writer fileWriter = null;
^
Jtermin01.java:312:40: cannot find symbol
symbol : method getNumOfRows()
location: class javax.swing.JTable
for (int i = 0; i < jTable1.getNumOfRows(); i++) {
^
2 errors

0

#13 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 04. November 2009 - 15:02

Das sind aber Fehler, die nichts mit meinem Code zu tun haben, sondern zu den Basics von Java gehören: Klassen müssen den selben Namen wie die Datei haben bzw. umgekehrt. Außerdem sagt die Fehlermeldung das auch deutlich.

Bei der zweiten Meldung musst du deine Imports fixen.
0

#14 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 04. November 2009 - 15:13

Ja das mit den Klassen und Namen ist mir schon klar xD - Ist auch nur eine "Falschaussage" des Programms. Liegt meistens an irgentwelchen Klammern die man vergessen hat. Nachdem ich eine Klammer weg genommen habe kommt nur noch:

Jtermin01.java:341:3: illegal start of expression
public void load()throws Exception{
^
1 error

Bei den Imports ect.. muss ja alles stimmen (oder fehlt was?) weil es ja mit meiner alten Methode auch geht. Habe meine mit "//" sicher gestellt und dein Code stattdessen eingegügt.
Das mit dem Try hatte ich vorher in einer extra Methode gehabt.

Trotz alledem funktionniert es leider immer noch nicht... das mit der exception hatte ich am Anfang auch weswegen ich dafür eine extra Methode erstellt habe.

Hier nochmal mein Import:

Zitat

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.DefaultTableModel;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.*;

0

#15 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 04. November 2009 - 22:05

Arbeitest du mit einer IDE wie Eclipse oder Netbeans, die sollten solche Fehler eigentlich direkt anzeigen und imports auch automatisch korrigieren.

Kannst du mal die ganze Datei posten? Dann schaue ich mir mal an, welche Klammer du genau vergessen hast. :)
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0