# Das Leerzeichen der Tastatur wird nicht gleichgesetzt mit dem Leerzeichen aus der Text Datei



## k0mpliziert_x3 (27. Jan 2020)

Ich erstelle ein Spiel wie ZTYPE -- Wörter werden durch ein BufferedReader eingelesen und in einer gewissen Zeit müssen diese Wörter abgetippt werden. Das Funktioniert soweit. Wenn ich allerdings ein Wort mit einem Leerzeichen zwischendrin habe wird das Leerzeichen nicht abgearbeitet.
Als Beispiel  das Wort:  1 + 1 = 2 

Die CodeZeilen für die Abarbeitung sowie den Bufferreader werde ich hier zeigen:

BufferReader:
private ArrayList<String> liste;

public Wörterbuch() {
    this.liste = new ArrayList<String>();
}

public void einlesen(String dateiname) {
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new FileReader(dateiname));
        String line;
        while((line=reader.readLine())!=null){
            this.liste.add(line);
            System.out.println(liste);
        }
        reader.close();
    }
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    finally{
        if(reader!=null){
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

Registrieren der Tasteneingabe:

this.setOnKeyTyped(e -> {
System.out.println("Eingabe registriert: "+e.getCharacter());

      this.controller.registriereTasteneingabe(e.getCharacter());
        }); 
Methode RegistriereTasteneingabe (noch nicht fertig, aber umrelevant für meine Frage)
public void registriereTasteneingabe(String eingabe) {
        boolean erfolgreich = this.derzeitigesSpiel.registriereTastatureingabe(eingabe);
        if (!erfolgreich) {
            // Falschen Buchstaben getippt
        }
    }
Methode registriereTastatureingabe 

public boolean registriereTastatureingabe(String eingabe) {
        /**
         * Fälle:
         * 1) Kein Wort wurde bisher "angefangen"   hallo, baum, auto
         * 2) Ein Wort wurde angefangen             HAllo, baum, auto
         * 3) Mehrere Worte haben den gleichen Anfang SPiegel, SPass
         */

        // Finde die Worte, bei denen bisher am meisten eingetippt wurde
        int maximalerFortschritt = 0;
        for (int i = 0; i < this.aktiveWorte.size(); i++) {
            maximalerFortschritt = Math.max(maximalerFortschritt, this.aktiveWorte.get(i).schonEingetippteZeichen());
        }

        // Bei den Worten, wo bisher am meisten eingetippt wurde: Tippe weiter 
        boolean richtigeTasteGetroffen = false;
        for (int i = 0; i < this.aktiveWorte.size(); i++) {
            if (this.aktiveWorte.get(i).schonEingetippteZeichen() == maximalerFortschritt) {
                richtigeTasteGetroffen = richtigeTasteGetroffen | this.aktiveWorte.get(i).buchstabeEintippen(eingabe.charAt(0));

            }
        }

        // Setze alle Worte zurück, die nicht dem neuen maximalen Fortschritt entsprechen
        for (int i = 0; i < this.aktiveWorte.size(); i++) {
            // Hat ein Wort noch den "alten" Fortschritt?
            if (richtigeTasteGetroffen && this.aktiveWorte.get(i).schonEingetippteZeichen() == maximalerFortschritt) this.aktiveWorte.get(i).resetWord();
        }

        //return this.aktivesWort.buchstabeEintippen(eingabe.charAt(0));
        return richtigeTasteGetroffen;
    }
}

und die letzte Methode buchstabeEintippen: 

public boolean buchstabeEintippen(char zeichen) { // character := zahl für buchstabe (ascii-codierung)
        // ganzeswort; Hallo
        // zND:        5
        // zeichen: E
        // => kontrollieren, ob H.equals(E)?
        char einzutippendesZeichen = ganzeswort.charAt(ganzeswort.length()-zeichenNochDa.get());
        if (einzutippendesZeichen == zeichen) {
            this.zeichenNochDa.set(this.zeichenNochDa.get()-1);
            return true;
        }
        else {
            return false;
        }

    }`


----------



## kneitzel (27. Jan 2020)

Also ich habe mir jetzt deinen Code angesehen und die Frage .... aber irgendwie werde ich nicht ganz schlau, was denn nun genau Dein Problem ist ... 

Aber nur mal ein Hinweis to try-with-resources:

```
public void einlesen(String dateiname) {
  try (BufferedReader reader = new BufferedReader(new FileReader(dateiname))) {
    String line;
    while((line=reader.readLine())!=null){
      this.liste.add(line);
      System.out.println(liste);
    }
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }
}
```

Das wird doch gleich viel lesbarer ohne das try / finally, oder?
(Ansonsten aber gut umgesetzt. Auf den ersten Blick ist mir nur aufgefallen, dass beim Erfolg 2 Mal close() aufgerufen wurde. Einmal im try-Block und dann noch einmal im finally Block ... 

Ansonsten fällt mir da erst einmal nichts groß auf. Aber Code bitte immer in Code-Tags posten. Und dann evtl. ein ganzes ausführbares Codebeispiel bauen, das das Problem zeigt.

Du hast das Problem, dass bei der Eingabe das Leerzeichen nicht dem ' ' entspricht? Oder kann es an der Textdatei liegen?
Einfach mal ein kleines Testprogramm schreiben und dann immer den Wert der Zeichen ausgeben ... dann siehst man am ehesten, was da Sache sein könnte ...


----------



## k0mpliziert_x3 (27. Jan 2020)

Ich habe gerade bemerkt, dass wenn ich ein Leerzeichen eintippe ein Button betätigt wird. Der Button ist in der selben Klasse wie setKeyOnTyped -- und den Button löse ich aus durch setOnAction --> kann ich das irgendwie beheben, dass mit einem Leerzeichen der Button ausgelöst wird?


----------



## kneitzel (27. Jan 2020)

Nimm dem Button den Fokus. Dann sollte er nicht mehr auslösen, wenn die Leertaste gedrückt wird.


----------



## k0mpliziert_x3 (27. Jan 2020)

JustNobody hat gesagt.:


> Nimm dem Button den Fokus. Dann sollte er nicht mehr auslösen, wenn die Leertaste gedrückt wird.


 das war jetzt tatsächlich der Grund -Danke  -- Wie kann ich nachträglich meinen Eintrag ändern?


----------



## kneitzel (27. Jan 2020)

Warum willst Du denn Eintrag ändern? Ist doch ok so, wie er ist. Ist doch nichts Schlimmes, dass man eine Ursache nicht sofort gesehen hat. Und das kann evtl. jemand anderem auch helfen, wenn er ein solches Problem hat.

Nach 30 Minuten oder so ist ein Beitrag für einen nicht mehr editierbar. Wenn, dann müsste das ein Moderator machen ...


----------

