# mehrere Listener für einen Button / Label



## Juergen-87 (14. Mrz 2015)

Hallo,

ich befasse mich zur Zeit mit der Umsetzung eines Kartenspiels. Dabei habe ich erstmal grundlegend zwei verschiedene Klassen (eine für Gui und eine für Spiel-Logik) und dann natürlich noch etliche Extra-Klassen für die verschiedenen Kartenstapel, Kartentypen und Sonderfunktionen.
Die Karten werden in der Gui in einer ArrayList<JComponent> gespeichert. Wenn die Karte eine Sonderfunktion hat wird ein Button erzeugt, der die Sonderfunktion auslöst und ansonsten einfach ein Label (jeweils mit Bild der Karte).
Bei einigen Sonderfunktionen muss dann eine bestimmte Karte ausgewählt werden (per Mausklick), auf die sich die Sonderfunktion bezieht. Das heißt, ich muss erst bei allen ausliegenden Karten den aktuellen ActionListener entfernen, dann einen neuen MouseListener hinzufügen und danach wieder alle ursprünglichen ActionListener herstellen. Gibt es dafür ein grundlegendes System, wie man an solche Probleme rangeht (also auf Buttons/Labels zu verschiedenen Zeitpunkten verschiedene Listener zu haben)?
Ich habe es wiefolgt umgesetzt:

```
public void guiFuerMauslistenerVorbereiten(){
		alleButtonsdeaktivieren();
		alleMouseListenerEntfernen();
	}
void alleButtonsdeaktivieren() {
		for(int i=0; i<kostenfreieKartenLabelArrayList.size();i++){
			if(kostenfreieKartenLabelArrayList.get(i) instanceof JButton){
				kostenfreieKartenLabelArrayList.get(i).setEnabled(false);
			}
		}
		for(int i=0; i<zusatzKartenLabelArrayList.size();i++){
			if(zusatzKartenLabelArrayList.get(i) instanceof JButton){
				zusatzKartenLabelArrayList.get(i).setEnabled(false);
			}
		}
	}

public void alleMouseListenerEntfernen(){
		for(int i = 0; i<(getKostenfreieKartenLabelArrayList().size());i++){
			MouseListener[] x = getKostenfreieKartenLabelArrayList().get(i).getMouseListeners();
			for(int j=0;j<x.length;j++){
				getKostenfreieKartenLabelArrayList().get(i).removeMouseListener(x[j]);
			}			
		}
		if (!getZusatzKartenLabelArrayList().isEmpty()){
			for(int i = 0; i<getZusatzKartenLabelArrayList().size();i++){
				MouseListener[] x = getZusatzKartenLabelArrayList().get(i).getMouseListeners();
				for(int j=0;j<x.length;j++){
					getZusatzKartenLabelArrayList().get(i).removeMouseListener(x[j]);
				}	
			}
		}
	}
	
	public void sonderfunktionListenerWiederherstellen(){
		for(int i=0; i<(getKostenfreieKartenLabelArrayList().size());i++){
			if(spiel.getKostenfreieKartenKarteArrayList().get(i).getSonderfunktion()!=null){
				((JButton) kostenfreieKartenLabelArrayList.get(i)).addActionListener(new SonderfunktionListener(this, spiel, spiel.getKostenfreieKartenKarteArrayList().get(i), ((JButton) kostenfreieKartenLabelArrayList.get(i))));
			}
		}
		if(!spiel.getZusatzKartenKarteArrayList().isEmpty()){
			for(int i=0; i<(getZusatzKartenLabelArrayList().size());i++){
				if(spiel.getZusatzKartenKarteArrayList().get(i).getSonderfunktion()!=null){
					((JButton) zusatzKartenLabelArrayList.get(i)).addActionListener(new SonderfunktionListener(this, spiel, spiel.getZusatzKartenKarteArrayList().get(i), ((JButton) zusatzKartenLabelArrayList.get(i))));
				}
			}
		}
	}
void ungenutzteSonderfunktionButtonsAktivieren(){
		for(int i=0; i<kostenfreieKartenLabelArrayList.size();i++){
			if(kostenfreieKartenLabelArrayList.get(i) instanceof JButton){
				if(!spiel.getKostenfreieKartenKarteArrayList().get(i).isFunktionGenutzt()){
					kostenfreieKartenLabelArrayList.get(i).setEnabled(true);
					kostenfreieKartenLabelArrayList.get(i).updateUI();
				}
			}
		}
		for(int i=0; i<zusatzKartenLabelArrayList.size();i++){
			if(zusatzKartenLabelArrayList.get(i) instanceof JButton){
				if(!spiel.getZusatzKartenKarteArrayList().get(i).isFunktionGenutzt()){
					zusatzKartenLabelArrayList.get(i).setEnabled(true);
					zusatzKartenLabelArrayList.get(i).updateUI();
				}
			}
		}
	}
```
Ich hoffe, ich hab allen relevanten Code dabei. Alles hochzuladen wird etwas kompliziert, da das Spiel schon ca. 50 Klassen hat.

Mein Problem liegt eben darin, dass das Wiederherstellen der ursprünglichen ActionListener nicht immer funktioniert und dabei manche nicht mehr aktiv sind.


----------



## Saheeda (16. Mrz 2015)

Mir ist noch nicht so ganz klar, warum du mehrere Listener auf einen Button legen willst. Für mich klingt es ziemlich schwer, das sauber zu koordinieren und zu debuggen.
Könntest du nicht z.B. mehrere Buttons nehmen und diese nach Bedarf ein- oder ausblenden?


----------

