String suchen und wenn gefunden, einfärben

[QUOTE=MannOhneNick]Anhand welchen Kriteriums splittest du denn deinen Text und vergleichst deinen String dann? Vielleicht wird dann klarer wieso es mit “.” und “,” Probleme gibt.
Das nur das 1. Wort markiert wird liegt an der Art und Weise wie “indexOf” arbeitet. So wie es da steht weis es nichts davon das du quasi den Satz schon bis Stelle X abgesucht hast. Du musst dir also noch merken wo du schon warst und ab wo du weitermachst.[/QUOTE]

Zu 1.: Das Weiß ich ja, das war auch ne unterschwellige Frage, ala Wie mach ich das?^^ Google spuckt dazu nix aus, von wegen an mehreren Stellen splitten.

Zu 2. Ich dachte, das macht er automatisch, da ich ja den Index vom Momentanen String auslese und der beim 2. Treffer ja ein anderer sein sollte, oder lieg ich da ganz falsch?
Aber so funzt es ja auch nicht:

                String source = TextArea.textArea.getText();
                try {
                    System.out.println("Try angefangen");
                    final String[] searchedItems = source.split(" ");
                    for (String searchedItem : searchedItems) {
                        System.out.println("In for drin");
                        if (searchedItem.equals(searched)) {
                            System.out.println("Im equals drin");
                            int indexZusatz = 0;
                            int indexRoh = source.indexOf(searchedItem);
                            int index;
                            index = indexZusatz + indexRoh;
                            indexZusatz = index;
                            int length = findTextField.getText().length();
                            TextArea.highlighter.addHighlight(index, index + length, DefaultHighlighter.DefaultPainter);
                            TextArea.isHighLighted = true;
                            System.out.println("Fertig mit " + searchedItem);
                        }
                        System.out.println("Abgelehnt: " + searchedItem);
                    }

                } catch (BadLocationException ex) {
                    Logger.getLogger(Finde.class.getName()).log(Level.SEVERE, null, ex);
                    System.err.println("Fehler: " + ex);
                }```
  1. “ist gleich” ist falsch. bleibt noch “beinhaltet” .). Also weniger das splitten als viel mehr der Vergleich. Sry falls das etwas missverständlich war

  2. simpel: ja. Denn dein “searchedItem” weiß ja nicht wo es im Text ist. Jedesmal wenn du “indexOf()” machst sucht er dir den Index des Strings raus, und das ist immer der erste Fund, zumindest so wie du es da machst. Als Hinweis: Guck dir mal an was es noch für andere “indexOf()” gibt, außer deiner mit einem Übergabeparameter. Dann solltest du auch recht schnell darauf kommen was du dir dann noch bei jedem Schleifendurchlauf merken musst

                String source = TextArea.textArea.getText();
                try {
                    System.out.println("Try angefangen");
                    final String[] searchedItems = source.split(" ");
                    for (String searchedItem : searchedItems) {
                        System.out.println("In for drin");
                        if (searchedItem.contains(searched)) {
                            System.out.println("Im equals drin");
                            int indexZusatz = 0;
                            int index = source.indexOf(searchedItem, indexZusatz);
                            int length = findTextField.getText().length();
                            TextArea.highlighter.addHighlight(index, index + length, DefaultHighlighter.DefaultPainter);
                            TextArea.isHighLighted = true;
                            System.out.println("Fertig mit " + searchedItem);
                        }
                        System.out.println("Abgelehnt: " + searchedItem);
                    }

                } catch (BadLocationException ex) {
                    Logger.getLogger(Finde.class.getName()).log(Level.SEVERE, null, ex);
                    System.err.println("Fehler: " + ex);
                }```

Das markiert jetzt alle, die gleich sind, bzw Text enthalten. Aber Sobald ein Zeilenumbruch kommt, oder die Groß/Kleinschreibung anders wird, klappt wieder nicht. Was stimmt hier wieder nicht, das ne Exception kommt?
```String searched = findTextField.getText();
                String source = TextArea.textArea.getText();
                try {
                    System.out.println("Try angefangen");
                    final String[] searchedItems = source.toLowerCase().split(" ");
                    for (String searchedItem : searchedItems) {
                        System.out.println("In for drin");
                        if (searchedItem.contains(searched.toLowerCase())) {
                            System.out.println("Im equals drin");
                            int indexZusatz = 0;
                            int index = source.indexOf(searchedItem, indexZusatz);
                            int length = findTextField.getText().length();
                            TextArea.highlighter.addHighlight(index, index + length, DefaultHighlighter.DefaultPainter);
                            TextArea.isHighLighted = true;
                            System.out.println("Fertig mit " + searchedItem);
                        }
                        System.out.println("Abgelehnt: " + searchedItem);
                    }

                } catch (BadLocationException ex) {
                    Logger.getLogger(Finde.class.getName()).log(Level.SEVERE, null, ex);
                    System.err.println("Fehler: " + ex);
                }```
Exception ist:
Fehler: javax.swing.text.BadLocationException: Invalid start offset

fehler liegt in der Zeile TextArea.highlighter.addHighlight....

Der Ansatz ist richtig. Alles durch den “toLowerCase()” parser zu jagen. Nun machst du aber den Fehler das du das “veränderte” Wort in dem original Text suchst. Das gibt es da aber nicht, da dort ja die Ausgangssitation unverändert ist.
Du musst also entweder das “indexOf” an den neuen Text anpassen, oder aber du musst dir das original Wort merken um es dann in dem Text zu suchen.

                String source = TextArea.textArea.getText();
                try {
                    System.out.println("Try angefangen");
                    int indexZusatz = 0;
                    final String[] searchedItems = source.toLowerCase().split(" ");
                    for (String searchedItem : searchedItems) {
                        System.out.println("In for drin");
                        if (searchedItem.contains(searched.toLowerCase())) {
                            System.out.println("Im equals drin");
                            int index = source.toLowerCase().indexOf(searchedItem, indexZusatz);
                            indexZusatz = index;
                            int length = findTextField.getText().length();
                            TextArea.highlighter.addHighlight(index, index + length, DefaultHighlighter.DefaultPainter);
                            TextArea.isHighLighted = true;
                            System.out.println("Fertig mit " + searchedItem);
                            System.out.println(indexZusatz);
                        }
                    }

                } catch (BadLocationException ex) {
                    Logger.getLogger(Finde.class.getName()).log(Level.SEVERE, null, ex);
                    System.err.println("Fehler: " + ex);
                }```

So kommt keine Exception mehr. Wenn ich jetzt aber

> Das ist ein Text, haha Text... text TEXt TExT TEXT

in die Area schreibe, markiert er nur die ersten beiden, weil sich der indexZusatz nichtmehr erhöht, warum? Das erste mal erhöht er sich ja auch. Ausgabe ist:

> Try angefangen
> In for drin
> In for drin
> In for drin
> In for drin
> Im equals drin
> Fertig mit text,
> 12
> In for drin
> In for drin
> Im equals drin
> Fertig mit text...
> 23
> In for drin
> Im equals drin
> Fertig mit text
> 23
> In for drin
> Im equals drin
> Fertig mit text
> 23
> In for drin
> Im equals drin
> Fertig mit text
> 23
> In for drin
> Im equals drin
> Fertig mit text
> 23

Erst wird Sie 12 gesetzt (fürn ersten Treffer) Dann 23 (fürn 2. Treffer) und dann bleibt sie so -.-

Das er überhaupt weiterzählt wundert mich grad selbst etwas. Setz deinen Index aber auf jedenFall mal eins weiter als du aktuell bist bzw warst. indexZusatz = index + 1

Auch kannst du die Länge nicht immer neu berechnen, denn die steht ja fest und kann aus der Schleife raus.

Danke :smiley: Daran lags, hätte ich aber auch selber draufkommen können >.< naja ist die Uhrzeit^^

Kein Ding. Nun noch bissel Code aufräumen, siehe Längen, das dauernd „toLowerCase()“ kann man nich schicker machen etc. pp und dann sollte das auch passe :slight_smile:

@Schesam :

HighlightPainter painter =new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
highlighter.addHighlight(0, 10, painter);

so als Anregung noch

Mach ich dann morgen^^
Aber mir fällt grad auf, das wenn ich nen Zeilenumbruch dazwischenhaue, das ganze nicht mehr funktioniert, hier maln Screen zur Verdeutlichung:

Wie mach ich das den weg?

Edit: Danke für den Tipp, schon erkennt man auch wieder was am markierten :stuck_out_tongue:

wie fügst du denn Zeilenumbrüche ein und wieso? Wenn per "
" vermut ich einfach mal das da der index durcheinander kommt. besser wäre eh, wenn du deine TextArea definierst und dann das ganze dann autom. festlegst

area.setText("Voll viel Text, welchermehr als 20 Zeichen hat und hoffentlich weniger als 10 Zeilen."
area.setLineWrap(true);```

Ich setze die Zeilenumbrüche mit der Enter-Taste, also mit
, ja. Aber den LineWarp hatte ich mal drin, das weiß ich noch, aber musste mit dem EditorPane raus^^

Aber das soll ja ein TextEditor werden und dann ist es doch blöd, wenn man keine manuellen Zeilenumbrüche machen dürfte? Weil er markiert ja auch die leeren Zeilen… und er markiert das Wort abzüglich der leeren Zeilen, schon komisch

mach ihn wieder rein. das sollte dein Problem lösen

€: bzw bin ich mir da aktuell grad selbst nicht sicher wieso das mal geht und mal nicht.

ist drin, wenn ich mit Enter Zeilenumbrüche reinhaue, kommts gleiche raus^^

        textArea.setWrapStyleWord(true);```

Edit: Hab was rausgefunden: Wenn ich in der ersten Zeile KEIN Leerzeichen am Ende mache, sondern so:

> Das ist ein Text, haha Text.... text
> 
> TEXT
> 
> TExT
> 
> TEXt
> 
> 
> 
> TexT


Am Ende jeder Zeile direkt der Zeilenumbruch, kein Leerzeichen, dann markiert er die 3 Text' in der ersten Zeile und das wars, die anderen Zeilen verbleiben, so wie sie sind

Das Problem könnte der Index und die neue Zeile sein. Nehmen wir an du hast folgenden Text
“extern
Text.”
Dann würde dir der Index “0” ausspucken. Plus die Länge von “text” wäre das eine Markierung von 0-4. Das wiederum bzieh sich aber auf die 1. Zeile, sprich “exte”.
Man müsste das ganze also Zeilenweise einlesen bzw. auswerten.

Ach Gott >.< Ich guck mir das Morgen an, bin Müde