# SetOnMouseReleased Mehrfach



## LeNkUeP (22. Jun 2018)

Hallo,

in einer Methode habe ich mehrere Stellen wo ich Events handle, darunter an einer Stelle benutze ich das Property SetOnMouseReleased.
Wird die Maus losgelassen soll etwas passieren...Es sind jedoch mehrere Bedingungen (if-Abfragen) daran gebunden!
Heißt das soll nicht bei jedem Aufruf der Methode gehandelt werden, sondern eben nur wenn diverse Bedingungen gelten.
Klappt auch soweit ganz gut nur hier das Problem:
Solange diese Stelle noch nicht erreicht/benutzt wurde passiert auch logischerweise nichts.
Wenn ich das aber einmal benutze bzw. erreicht habe, dann wird das auch danach wenn ich das eigentlich nicht möchte, bei dem Methodenaufruf sofort aufgerufen...und das obwohl die If-Abfragen das eigentlich verbieten sollten:/
Ich denke ich habe das ganze Event-Verarbeitungssystem noch nicht eindeutig durchblickt und verstehe da was falsch...
Hat jemand eine Idee wieso das so ist, oder sogar eine Lösung parat? 
Hier noch ein bisschen Code:

Unerwünscht mehrfach aufgerufene Stelle:

```
dragContext.anchorPane.setOnMouseReleased(
new EventHandler<MouseEvent>() {
public void handle(final MouseEvent mouseEvent) {
blablabla }
});
```
Das ist die Stelle welche nach erstem Aufruf danach noch weiterhin ungewollt aufgerufen wird!

Hoffe mir kann jemand helfen
Danke im Voraus


----------



## VfL_Freak (22. Jun 2018)

Moin,

so ganz habe ich es nicht verstanden ...



LeNkUeP hat gesagt.:


> Heißt das soll nicht bei jedem Aufruf der Methode gehandelt werden, sondern eben nur wenn diverse Bedingungen gelten.


Reichen da nicht ein paar passende Bedingungen mit entsprechenden IF-Anweisungen?
So steuere ich sowas zumindest ...

VG Klaus


----------



## Robat (22. Jun 2018)

Das "blablabla" wäre glaube ich ganz interessant um mehr sagen zu können.. 
Prinzipiell sollte es mit den if-Abfragen funktionieren..


----------



## LeNkUeP (22. Jun 2018)

Okay ich lade mal ein bisschen mehr hoch...


----------



## LeNkUeP (22. Jun 2018)

Die Stelle wird in einer Methode unter mehreren if Bedingungen verwendet:

```
private void dragTile(DragContext dragContext, Tile tile, MouseEvent mouseEvent){
if(...){if(...){...SetOnMouseReleased(...)}}
```

Somit kann meines Wissens nach das eh nur erkannt werden, wenn die Methode auch aufgerufen wird...korrigiert mich falls das falsch ist.

Die Methode dragTile wird immer hier aufgerufen:

```
node.addEventFilter(
                    MouseEvent.MOUSE_DRAGGED,
                    new EventHandler<MouseEvent>() {
                        public void handle(final MouseEvent mouseEvent) { dragTile(...);
```

Somit kann im Endeffekt alles nur passieren, wenn man meine node DRAGGED!

Wenn ich jetzt aber nachdem das aufgerufen wurde eine node nur ANKLICKE (habs schon geprüft der geht auch nicht in irgendeine DRAGGED Methode rein), dann geht der immer zuerst wieder in dieses SetOnMouseReleased...Das Komische ist dass der dann die alte node (also die node welche man da einen Schritt vorher gedraggt und losgelassen hat) nochmal durch dieses Event durchjagt...obwohl es mittlerweile um eine ganz andere node geht! Irgendwie behält Eclipse sich also die alte node und wartet auf einen Release...keine Ahnung

Hoffe das war jetzt besser erklärt aber danke schon mal für eure Antworten


----------



## Robat (22. Jun 2018)

Du willst also das mouseReleased nur ausgeführt wird wenn vorher mouseDragged ausgeführt wurde?
Wäre das dann nicht setOnDragDropped(..) ?


----------



## mrBrown (22. Jun 2018)

keine Ahnung ob ich’s richtig verstanden habe, aber ich versuchs mal...

Also: in dragTile fügst du den Listener irgendwem hinzu, wenn eine Bedingung zutrifft.
Sobald ein Listener einmal hinzugefügt wurde, bleibt der so lange an dem Element hängen, bis du ihn explizit entfernst.
Sobald er also einmal hinzugefügt wurde, wird er auch vollkommen unabhängig von der Methode, die ihn hinzufügte, ausgeführt.


----------



## LeNkUeP (27. Jun 2018)

Ich habe es noch nicht ausprobiert aber mrBrowns Antwort scheint wohl die Lösung zu sein, da mir das so irgendwie entgangen ist...ich werde es mal versuchen und melde mich nochmal danke für alle Antworten


----------



## LeNkUeP (27. Jun 2018)

Okay ich habe überall die Stellen ausgetauscht wo ich einen EventFilter geaddet habe.
Nun besteht alles nur noch aus folgenden Konstrukten:

```
node.setOnMouseReleased(
                    new EventHandler<MouseEvent>() {
                        public void handle(final MouseEvent mouseEvent) {
```
Natürlich ist das nur ein Teil davon...

Jetzt würde ich erwarten, da ich nirgendwo mehr das verwende:

```
node.addEventFilter(
                    MouseEvent.MOUSE_DRAGGED,
```
...dass auch kein Event nachträglich ausgeführt werden kann, da ich jetzt nur noch mit den properties setOnMouseReleased usw. arbeite. Stimmt das?
Auf jeden Fall hat sich nichts geändert...irgendwie geht eclipse da immer noch ein zweites Mal rein mit der zuletzt gedraggten Tile???
Wenn ich nur mit diesen properties arbeite, dann sollte das doch nun kein Problem mehr sein oder?


----------



## mrBrown (27. Jun 2018)

Was meinst du mit „ein zweites Mal“? Das sollte  jeweils dann aufgerufen werden, wenn ein MouseButton released wird.

Wenn es nur in bestimmten Situationen aufgerufen werden soll, musst du das selber mir entsprechenden Bedingungen behandeln


----------



## LeNkUeP (27. Jun 2018)

Das Problem ist, wenn ich eine Tile loslasse dann sollte eigentlich alles zu dieser Tile vergessen werden...bis man sie dann erneut anklicken würde.
Das ist bei mir aber nicht so...ich weiß nicht wie ich das Problem sonst noch beschreiben kann...Das kann kein typischer Denkfehler meinerseits sein, höchstens weiß ich etwas nicht bzw. verstehe nicht genau was Java bei Events alles so macht...


----------



## LeNkUeP (27. Jun 2018)

Ah super ich glaube ich habs 
Ich habe einfach am Ende von einem Drag-Prozess das property zurückgesetzt: also setOnMouseDragged(null)...
Ohne eure Hilfe hätte ich das nicht geschafft danke an alle^^


----------



## mrBrown (27. Jun 2018)

Schwierig zu beurteilen, ob das sinnvoll ist...



LeNkUeP hat gesagt.:


> Das Problem ist, wenn ich eine Tile loslasse dann sollte eigentlich alles zu dieser Tile vergessen werden...bis man sie dann erneut anklicken würde.
> Das ist bei mir aber nicht so...ich weiß nicht wie ich das Problem sonst noch beschreiben kann...Das kann kein typischer Denkfehler meinerseits sein, höchstens weiß ich etwas nicht bzw. verstehe nicht genau was Java bei Events alles so macht...


Die Erklärung ist nicht wirklich hilfreich, einmal abstrakt erklären, was du erreichen möchtest, könnte helfen 
(mit "Tile vergessen" kann vermutlich niemand was anfangen  )


----------



## LeNkUeP (28. Jun 2018)

Okay ich versuchs mal allgemein 
Ich möchte anfangs einen Drag auf einer Node erkennen, da dann aber wegen bestimmten Vorgängen diese Node verloren geht (bei mir: Node wird nicht mehr angezeigt da ich eine Seite gewechselt habe), erstelle ich einen Klon welcher dann ebenfalls auf Drags reagieren soll...quasi ein Drag-Prozess in einem Drag-Prozess^^
In meinem Fall gibt es TilePanes auf welcher verschiedene Tiles zu sehen sind, wechselt man die TilePane über einen Klick auf einen Pfeil, geht die Tile die man draggt verloren...bzw. Tile.this funktioniert nicht mehr.
Daher erstelle ich einen Klon auf einem AnchorPane, welches sich bei einem Seitenwechsel nicht verändert.
So kann ich die gedraggte Tile auf eine andere Seite ziehen ohne dafür die Ausgangs-tile zu verlieren...und mein Code zwingt mich dazu diesen relativ sonderbaren Weg einzuschlagen  Hoffe ich konnte es jetzt besser erklären.


----------



## LeNkUeP (28. Jun 2018)

Als Zusammenfassung für zukünftige Unwissende wie mich kann man sagen: 
Properties (setOnMouseDragged, usw.) sollten (je nach Fall) zurückgesetzt werden.
Jetzt im Nachhinein macht das auch total Sinn, hab halt gar nicht darüber nachgedacht


----------

