Drop-Inhalt bearbeiten

Ich habe ein JTextField, in welches aus einer JEditorPane Text per Drag & Drop hineingezogen wird. Es wird auch mit zum einen per normaler Eingabe in dem Feld und zum anderen per .setText() der Text dieses JTextFields verändert.

Reagieren möchte ich genau auf das Setzen des Textes per Drag & Drop.

Mit

                new DocumentListener() {
                    @Override
                    public void insertUpdate(DocumentEvent e) {
                        System.out.println("insertUpdate");
                    }
                    @Override
                    public void removeUpdate(DocumentEvent e) {
                        System.out.println("removeUpdate");
                    }
                    @Override
                    public void changedUpdate(DocumentEvent e) {
                        System.out.println("changedUpdate");
                    }
                });

kann ich zwar Änderungen am Inhalt mitbekommen, aber insertUpdate() wird leider sowohl beim Tippen im Feld, beim Setzen des Textes per .setText() als auch beim Einfügen mit Drag & Drop aufgerufen.

Gibt es irgendeine Möglichkeit, diese Fälle hier zu erkennen oder irgendwo anderweitig das Einfügen per Drag & Drop zu erkennen?

Hintergrund ist, dass gewisse per Drag & Drop eingefügte Daten noch verändert werden sollen, damit es die User bequemer haben.

Du kannst dir vom JTextField ein DropTarget holen und dort einen Listener registrieren.
Darüber kannst du dann benachrichtigt werden wenn jemand etwas in dein JTextField hinein dropt. Ich weiß allerdings nicht genau ob du irgendwie an den Inhalt kommst der reingeschrieben werden soll und ob du den noch bearbeiten kannst.

als eine unsaubere Möglichkeit erwähnt kann man sich auch den StackTrace hin zum DocumentListener-Aufruf anschauen,
ist z.B. at java.awt.dnd.DropTarget.drop dabei oder nicht


edit:
und allgemein auch die Technik der Flags:
entweder bei normalen Aktionen oder beim Drop vorher schaffen eine boolean-Variable zu setzen, wenn gesetzt dann an vakanter Stelle ohne Info (wie DocumentListener) den boolean als Info verwenden,

nicht vergessen boolean auf irgendeine Weise wieder zurückzusetzen oder unsauber nur x ms gelten zu lassen…,
zumindest bei setText()-Aufruf im Quelltext gut zu steuern, vorher + nachher boolean setzen,
bei Benutzereingaben und Strg-C/V nicht so leicht, hier sicher wenig geeignet

Danke, so hab ich es nun gemacht.

Das wäre schön. Da kam ich so nicht dran. Ich habe mich dann damit beholfen, den Inhalt aus dem Textfeld beim dragEnter() und beim drop() auszulesen und den alten Inhalt zu löschen, falls der neue mit dem alten anfängt. Etwas hässlich.

Besser wäre es, den alten Text vorher komplett zu löschen. Aber das ist hier nicht gut möglich: Man kommt nämlich nicht mit diesen Methoden an die Stelle, wo der Mausklick über dem JTextField ausgelöst wurde, der Drop-Text aber noch nicht eingefügt wurde.

So geht es aber auch.