PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Text markieren in einer TextArea



mwanaheri
09-10-2006, 11:49
Morgen,
ich schreibe gerade an einem interaktiven Parser. Dafür muss will ich in einer TextArea den Satz, der gerade bearbeitet wird, farbig hervorheben (markieren). Mein Problem ist nun, dass die Markierung erst sichtbar wird, wenn der Benutzer einen Teil des Textes per Hand markiert hat., ansonsten wird zwar der Text durchlaufen, aber keine sichtbare Markierung angezeigt.
Eine kleine Methode zeigt den Haken:



private void markNextSentence(){
text = taTextAnzeige.getText();
selectionStart = selectionEnd + 1;
selectionEnd = text.indexOf((int)'.', selectionEnd + 1);
taTextAnzeige.select(selectionStart, selectionEnd);
System.out.println("start: " + selectionStart + "\nende: " + selectionEnd);
}
selectionStart und selectionEnd sind initialisiert mit 0 bzw. 1, falls es der erste Lauf ist.


Weiß jemand, wie ich das hinkriege, dass ohne vorherige Auswahl des Benutzers markiert wird?

falke2203
11-10-2006, 06:26
Hmmm... Habe das gerade mal nachgebaut. Einfach nen JFrame mit einer JTextArea und ein Thread, der so lange deine Methode aufruft, bis der Text komplett durchlaufen ist. Ich bekomme jeden Satz markiert. Ich habe aber eine Vermutung, woran es liegen könnte. Die Verarbeitung eines Satzes wird vermutlich recht wenig Zeit in Anspruch nehmen. In meinem Thread hatte ich vor jeder Iteration ein sleep(2000) eingebaut, wenn ich das rausnehme bekomme ich die Markierung auch nur noch als leichtes Flackern zu sehen. Je nach verwendetem Rechner und verwendetem L&F könnte das dann tatsächlich dazu führen, dass es bei dir aussieht, als würde nicht markiert...

mwanaheri
11-10-2006, 14:18
An der Geschwindigkeit liegt es nicht, denn bei mir wird das Weiterlesen durch einen Buttondruck ausgelöst. Immerhin habe ich aber inzwischen ein Workaround gefunden:
Es muss sichergestellt sein, dass die TextArea nach dem Füllen wenigstens ein mal den Focus erhält, also nach dem Setzen des Textes ein textArea.requestFocus() aufrufen. Möglicherweise werden die markierten Positionen erst bei Focuserhalt initialisiert.

Vielen Dank für Deine Mühe.