# MouseListener reagiert 2 Mal



## Pommes9485 (12. Sep 2011)

Guten Tag,

ich benutze eine JLabel und lasse beim klicken auf eine der Zeilen etwas passieren. Aber komischerweise passiert dies IMMER zweimal. Ich dachte es würde daran liegen, das der Klick zweimal gewertet wird, weil er so lang ist(erklärung blöd, klang aber ganz plausibel), aber obwohl ich nach der Aktion eine Sekunde warte, macht er es dennoch 2 mal.

Hier der Code des Listeners...

```
table.addMouseListener(new MouseListener(){
                public void mouseExited(MouseEvent e){}
                public void mouseEntered(MouseEvent e){}
                public void mouseReleased(MouseEvent e){}
                public void mousePressed(MouseEvent e){}
                public void mouseClicked(MouseEvent e){
                int i = table.rowAtPoint(e.getPoint());
                if(dir.getAbsolutePath().endsWith("\\"))
                {
                    String pfadee = dir.getAbsolutePath()+(String)table.getValueAt(i,1)+ "\\";
                    System.out.println(pfadee);
                setzePfad(pfadee);
                
                }
                else
                {
                 String pfadee = dir.getAbsolutePath() +"\\"+(String)table.getValueAt(i,1)+ "\\";
                    System.out.println(pfadee);
                setzePfad(pfadee);
                
                }
                long time = System.currentTimeMillis();
               time += 1000;
              while(System.currentTimeMillis()<=time)
                {
    
                    warten();
               }
                System.out.println("Klick");
                }
        });
```

Könnt ihr mir helfen ? Habe urspünglich den Doppelklick nehmen wollen, allerdings funktionierte das überhaupt nicht. Mein Primär Problem ist allerdings das oben beschriebene...


----------



## Marco13 (12. Sep 2011)

Sicher, dass die Methode, in der der Gepostete Teil steht, nicht zweimal aufgerufen (und damit der MouseListener ZWEI mal hinzugefügt) wird?


----------



## Pommes9485 (12. Sep 2011)

Du hast recht, da war ein Logikfehler meinerseits mit aufgeführt. Gibt es eine Möglichkeit ALLE MouseListeners zu entfernen...

Ich entferne jeden meinen eigenen MouseListener nun sofort. Aber er handelt dennoch genauso...


----------



## Ark (12. Sep 2011)

Ohne Code ist das jetzt sehr schwierig … Du musst schon zeigen, wie und wo du die Listener hinzufügst bzw. wieder entfernst.

Im Übrigen klingt das ziemlich nach Holzhammer … genauso wie diese [c]warten()[/c]-Konstruktion. 

Ark


----------



## L-ectron-X (12. Sep 2011)

Hat zwar nichts mit dem Problem zu tun. Aber für deine Art und Weise den MouseListener zu implementieren gibts den [japi]MouseAdapter[/japi]. Dann brauchst du nur noch die benötigte Methode zu überschreiben, die nicht benutzen kannst du dann weglassen.


----------



## bERt0r (12. Sep 2011)

Pommes9485 hat gesagt.:


> Du hast recht, da war ein Logikfehler meinerseits mit aufgeführt. Gibt es eine Möglichkeit ALLE MouseListeners zu entfernen...
> 
> Ich entferne jeden meinen eigenen MouseListener nun sofort. Aber er handelt dennoch genauso...



Sollte so funktionieren:

```
MouseListener[] listeners=component.getMouseListeners();
for(MouseListener l:listeners)
{
component.removeMouseListener(l);
}
```


----------



## Marco13 (12. Sep 2011)

Das ist auch eine Holzhammermethode - das sollte man i.a. NICHT machen. Niemand weiß, wer sonst dort welche Listener registriert hat, und was durch so eine Aktion vielleicht nicht mehr funktioniert...


----------



## Empire Phoenix (13. Sep 2011)

Btw können da auch Java specifische listener registriert sein, aka clicked effect bei buttons ect.


----------



## MarderFahrer (13. Sep 2011)

Ich würde auch daraf tippen, dass 
	
	
	
	





```
table.addMouseListener
```
 zweimal durchlaufen wird. Somit wird zweimal der Listener angelegt und es gibt zwei Ausgaben.

Du könntest vor dieser Zeile einmal einen 
	
	
	
	





```
System.out.println("Test")
```
 schreiben und dann das Programm laufen lassen. Wird die addMouseListener Zeile zweilmal ausgeführt, hast du zweimal "Test" auf der Konsole.

Sollte das der Fall sein, wäre eine Möglichkeit, den Mouse Listener in eine externe Klasse auszulagern, und die 
	
	
	
	





```
table.addMouseListener
```
 Zeile in den Konstruktor von deiner Klasse zu packen. So sollte sie nur bei erzeugung deiner Klasse einmal ausgeführt werden.


----------



## Pommes9485 (13. Sep 2011)

Danke euch allen. Ich weis garnicht was da am Anfang nicht ging, aufjedenfall hatte ich den MouseListener nach jedem klicken neu gemacht. Das habe ich jetzt anders gelöst und es funktioniert.

Ich weis das die warten Methode die Performance nicht gerade erhöht, aber wie würdet ihr es machen ?


----------



## Michael... (13. Sep 2011)

Pommes9485 hat gesagt.:


> Ich weis das die warten Methode die Performance nicht gerade erhöht, aber wie würdet ihr es machen ?


Was soll diese denn bezwecken?
Soll ein Mausklick erst wieder nach einer Sekunde möglich sein? Generell gibt's für solche Sachen Threads, Timer...


----------



## Pommes9485 (13. Sep 2011)

Das warten beim Mausklick habe ich bereits wieder rausgenommen, es war sehr unlogisch. Danke euch !!!


----------

