[TextArea] Text markieren on-the-fly

Kriz

Mitglied
Hallo,

ich sitze gerade an einem AWT Texteditor dran und habe gerade bemerkt, daß On-the-fly Textmarkierungen mit Tastaur/Maus anscheinend nicht von Java registriert werden. Wenn ich also etwas Text markiere, dann "bemerkt" Java das mittels getSelectionStart() & Co. erst dann, wenn ich ein ActionEvent auslöse und mir die Ergebnisse der Methoden auf der Statuszeile des Fensters ausgeben lasse.

On-the-fly dagegen ist Java taub und blind. Was aber zum Teufel bringen mir informative Markierungsmethoden, wenn die Werte nicht zur Markierungszeit ermittelt werden können? Das kann's ja wohl nicht sein...

Hintergrund ist der, daß ich im Editmenü Cut, Copy und Paste erst dann via setEnable() freischalten möchte, wenn a) Text vorhanden ist UND b) der User gerade was selektiert hat. Das Dumme ist wie gesagt nur, daß Java das in keinster Weise abrafft, wenn der User was markiert. Ich will ja niemanden zumuten, erstmal nen Button ect. anzuklicken, damit Java aufwacht und merkt, daß Text markiert worden ist...

Ich dachte schon an komplizierte KeyEvent Abfragen aus der TextArea, aber das ist ja mehr Aufwand als sonstwas! Es muß doch irgendwie möglich sein, on-the-fly Markierungen von Text durch Java überwachen zu lassen, oder nicht?

Wäre für Gegenmaßnahmen aller Art sehr dankbar :)

PS: OS ist XP Professional und JDK ist 1.6 beta, falls das von Bedeutung sein sollte.
 
Hallo Kriz,

das geht sehrwohl. Natürlich registriert Java Markierungen etc.

Die TextArea unterstüzt unter anderem die Listener (KeyListener, MouseListener). Deine Aufgabe ist es jetzt diese horchen zu lassen und abzufragen ob eine Markierung vorhanden ist. Falls ja werden Cut und Copy aktiviert bei nein deaktiviert. Das wars und nicht mehr ;) !

Hinweis: Mit Swing geht es einen Tick einfacher. Da gibt es nämlich den CaretListener für JTextArea. Damit reicht es dir nur diesen zu registrieren anstatt Key- und MouseListener.


Vg Erdal
 
Zuletzt bearbeitet:
Hallo flashray,

den Gedanken hatte ich ja auch, aber ich habe da schon wieder viel zu kompliziert gedacht. Tatsache ist, daß eine TextArea erst nach einem Event aktuelle Daten über Markierungen usw. erhält. Pures On-the-fly ist also nicht möglich.

Die Lösung war so einfach, daß es mir schon beinahe peinlich ist:

Code:
// Markierungen per Tastatur erkennen

public void keyReleased(KeyEvent event)
{
    if(textArea.getSelectionStart() != textArea.getSelectionEnd())
    {
        setTitle(textArea.getSelectedText());
    }
}

// Dasselbe per Mauseinsatz

public void mouseReleased(MouseEvent event)
{
    if(textArea.getSelectionStart() != textArea.getSelectionEnd())
    {
        setTitle(textArea.getSelectedText());
    }
}
Simpler geht's ja schon nicht mehr :)

Danke für den Denkanstoß!
 
Hallo Kriz,

wie schon gesagt, musst du mit den Listenern zu recht kommen die es gibt und notfalls wie hier welche kombinieren. Bei Swing gibt es auch kein Listener der horcht ob der Text markiert wurde oder nicht. Da aber eine Markierung mit dem Caret zusammenhängt genügt der CaretListener.


Vg Erdal
 
Nun ja, ich programmiere mit Java schon ein paar Jährchen, aber eigentlich nur Pakete für andere Dinge, weniger GUI. Und wenn, dann nur Swing. Allerdings gefällt mir AWT (entgegen dem Mainstream) gerade wegen seiner Einfachheit und da wollte ich mal gucken, was mit den reinen Peerobjekten so alles möglich ist.

Das 1.1er Eventsystem ist für mich kalter Kaffee, nur manchmal denke ich zu kompliziert. Das hängt manchmal damit zusammen, daß einige Dinge im AWT nur mit erheblichem Aufwand zu realisieren sind, so z.B. bei so manchen abgeleiteten AWT Klassen, die ich irgendwann mal erstellt hatte (LimitedTextField, NumberTextField, ProgressBar, usw.). Dort muß man ab und an sehr tief ins Getriebe greifen, so daß man bei so simplen Sachen wie hier mit der TextArea übers Ziel hinausdenkt ;)

Eventuell bastel ich mir gleich 'ne Art SelectableTextArea Klasse, die automatisch auf Markierungen in "Echtzeit" regiert.
 
Hallo,

hat es jemand von euch hinbekommen, dass man die Markierung in Real-time in einem anderen Feld gezeigt bekommt (z.b. in einem Label oder anderem Textfeld)?

Bei den obigen Möglichkeiten bekommt man das markierte Stück ja nur wenn der Event wirklich feuert und das ist nun mal genau dann wenn die Markierung schon fertig ist.
Ich will aber dass sie, wie Kriz schon gesagt hat, on-the-fly also bei Änderung jedes Buchstabens im Label verändert wird!!

Vorschläge
 

Neue Beiträge

Zurück