Strings prüfen

Justin09

Neues Mitglied
Hallo zusammen, ich habe folgendes Problem:
Ich möchte Daten aus einer Datei zeilenweise.
D.h eine Zeile soll ausgegeben werden, dann soll der User schauen ob der Ausgegebene String richtig ist, mithilfe eines Unterfensters.
Wenn dann überprüft wurde, soll die nächste Zeile angezeigt werden und das Fenster öffnet sich zur Überprüfung erneut.
Es klappt bisher alles außer, dass eben nur eine Zeile ausgegeben wird und ich dann überprüfen kann ob es richtig ist.
[CODE lang="java" title="Das ist der dazugehörige Code"] private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
List<String> liste = new ArrayList();
String dateiname = Dateilesefeld.getText();
String[] speicher;
if ("apfel.txt".equals(dateiname))
try {
FileReader lesehilfe = new FileReader("C:\\Users\\thedr\\Documents\\NetBeansProjects\\Pruefungsvorbereitung\\src\\main\\java\\apfel.txt");
BufferedReader leser = new BufferedReader(lesehilfe);
while (leser.ready()) {
gelesen = leser.readLine();
liste.add(gelesen);
speicher = gelesen.split(";");
for (int i = 0; i < speicher.length; i++) {
jTextArea2.append(speicher);
jTextArea2.append("\n");

}
jTextArea2.append("Info korrekt?");
jTextArea2.append("\n");

}
} catch (IOException ex) {
Logger.getLogger(Oberfenster.class.getName()).log(Level.SEVERE, null, ex);[/CODE]
 
Wenn nur eine Zeil eingelesen wird, ist es möglich, dass dein Leser wohl nicht mehr ready ist nach der ersten Zeile.
Hast du schon mal im Log geprüft, ob es danach einen Fehler gab?

"Das Fenster öffnet sich erneut" ... nicht in deinem Code. Hier veränderst du nur eine TextArea.
Außerdem musst du die Logik in einen eigenen Thread verschieben, die UI ändert sich nämlich erst, wenn der Handler komplett fertig ist.
D.h. "jTextArea2.append" wird keine Auswirkung auf den Bildschirm haben, bis alle Zeilen eingelesen und bestätigt sind.

Du schließt die Reader nicht, auch nicht gut. Falls du sie nicht manuell schließen willst, verwende try-with-resource
Das schließt alle AutoCloseables nach Verwendung.


Dein Code macht zu viel auf einmal, er hält die Datei offen, bis alle Zeilen vom User bestätigt wurden, das ist nicht gut. Dateizugriffe sollten so kurz wie möglich gehalten werden.

Splitte das Ganze mal.
Java:
List<String> fileContent = readAllLines(filename); //die Datei wird in der Methode geöffnet und auch wieder geschlossen.

Dann überprüf als erstes Mal, ob die Datei korrekt eingelesen wurde (einfaches println pro Zeile).

Für die Logik erstellst du dann einen eigenen Thread, an den du die eingelesenen Zeilen übergibst.
Der Thread gibt dann jede Zeile aus und wartet auf die Nutzereingabe nach jeder Zeile, entweder durch das genannte "Neuöffnen" oder was anderes.
Wenn es für jede Zeile einen eigenen Dialog braucht, bietet sich JOptionPane() an.
 
Zuletzt bearbeitet:
Edit: Sorry, hab das mit dem NeuÖffnen übersehen, werde nochmal nachbearbeiten.

Wenn nur eine Zeil eingelesen wird, ist dein Leser wohl nicht mehr ready nach der ersten Zeile.
Hast du schon mal im Log geprüft, ob es danach einen Fehler gab?

Eine TextArea ist keine Konsole. Wie soll der Benutzer hier bestätigen, ob der Text ok ist?

Außerdem hast du hier ein Problem mit Threads. Die UI wird erst aktualisiert, wenn der Listener des Buttons komplett beendet wurde.
D.h. "jTextArea2.append" wird keine Auswirkung auf den Bildschirm haben, bis alle Zeilen eingelesen sind. Du musst die Logik in einen eigenen Thread verschieben, damit die UI sofort reagiert.

Du schließt die Reader nicht, auch nicht gut. Falls du sie nicht manuell schließen willst, verwende try-with-resource
Das schließt alle AutoCloseables nach Verwendung.

Als letztes:
Dein Code macht zu viel auf einmal, er hält die Datei offen, bis alle Zeilen vom User bestätigt wurden, das ist nicht gut. Dateizugriffe sollten so kurz wie möglich gehalten werden.


Splitte das Ganze mal.
Java:
List<String> fileContent = readAllLines(filename); //die Datei wird in der Methode geöffnet und auch wieder geschlossen.

Dann überprüf als erstes Mal, ob die Datei korrekt eingelesen wurde (einfaches println pro Zeile).

Für die Logik erstellst du dann einen eigenen Thread, an den du die eingelesenen Zeilen übergibst.
Der Thread gibt jede Zeile aus und wartet nach jeder Zeile auf die Benutzereingabe.
Der User kann das durch ein Unterfenster bestätigen, in dem mehrere RadioButtons sind, hätte ich vielleicht dazuschreiben sollen, tut mir leid ^^
 
Der User kann das durch ein Unterfenster bestätigen, in dem mehrere RadioButtons sind, hätte ich vielleicht dazuschreiben sollen, tut mir leid ^^
Ist ok, das war eher so eine Detailfrage. Ich seh im Code aber eh nirgends, dass du irgendwo auf eine Eingabe warten würdest.
Dein Code macht nichts anderes, als alle Zeilen und jeweils die dazu passende Meldung in die TextArea zu schreiben.
 
@Neumi5694 hat gute Ideen gebracht, die so umsetzbar sein müssten. Ich würde dabei aber ggf. etwa etwas anders aufteilen um dann auch auf den Thread verzichten zu können.

So versuchst Du derzeit alles in einer Methode zu machen - das ist so immer extrem schlecht. Eine Oberfläche ist Event getrieben - also überleg Dir genau, was bei jedem Event passieren soll!

Und wie immer gilt: Schreib Dir das auf und verfeinere es.

a) Es wird ein Knopf gedrückt und dann wird eine Eingabe genommen und die Datei geöffnet. Die erste Zeile wird gelesen und angezeigt.

b) Es wird die Zeile bestätigt: Die nächste Zeile wird gelesen und angezeigt (und was auch immer)

c) ....

Da wirklich alles, was da passieren soll, genau beschreiben. Daraus kannst Du dann Code ableiten.

Dein BufferedReader kann dann z.B. nicht lokal in einer Methode sein, denn Du brauchst den ja in mehreren Events. Also so wie die Controls auch -> Instanzvariable!

Also wirklich alles so einzelnd durchgehen! Und dann über alle Fälle nachdenken:
Was ist wenn ein User zwei Mal a) macht? Also wenn ein BufferedReader offen ist, dann schließen wir den erst einmal.
Was ist, wenn der User das Fenster schließt? Dann macht man den BufferedReader, so einer offen ist, auch zu
...

Das Vorgehen ist somit immer vergleichbar nur eben betrachtest Du jetzt Aktionen, die der User machen kann. Und als zweiten Schritt schaust Du, was für Zustände du hast (Also z.B. Noch kein BufferedReader oder du hast schon einen offenen BufferedReader) um dann zu entscheiden, welche Events erlaubt sind oder nicht und um dann die Handlung zu prüfen. (So kannst Du z.B. Event A) verhindern so lange eine Datei nicht zu Ende bearbeitet wurde, also z.B. den Button davon Disablen.)
 

Neue Themen


Zurück
Oben