# Verändern einer Variable im ActionListener



## filouweb (30. Jan 2009)

Hallo,

ich habe folgendes Problem:

Ich möchte beim Klick auf einen Button eine Variable weiterzählen lassen. Dazu möchte ich einen ActionListener aufrufen, der die (bereits vorhandene) Variable dann um eins erhöht.
Der ActionListener kann jedoch nur auf "final" Variablen zugreifen und die sind wiederum nicht veränderbar.
Ich verstehe beim besten Willen nicht, wie ich das hinbekommen soll!

Schon jetzt danke für eure Hilfe!


filouweb


----------



## SlaterB (30. Jan 2009)

das final zählt nur für lokale Variablen und lokale Variablen zu ändern macht doch keinen Sinn, 
die erstellende Methode wird zum Zeitpuntk des Buttonklicks doch hoffentlich längst beendet sein,

verändern kannst du Klassenattribute


----------



## Guest (30. Jan 2009)

:roll: Ich verstehe garnichts mehr!
Konkret: Ich habe beispielsweise folgenden Code:



```
[...]
public class Main_Class {
	


	public static void main(String[] args) throws Exception {
[...]
JButton weiter = new JButton("weiter");

int zaehler = 0

			
ActionListener weitergeklickt = new ActionListener() {
public void actionPerformed( ActionEvent e ) {

zaehler = zaehler + 1;


}
	}; 

weiter.addActionListener(weitergeklickt);

[...]
```

Der Action Listener soll die Variable zaehler um eins erhöhen.


----------



## SlaterB (30. Jan 2009)

was bringt es dir, die Variable zaehler zu erhöhen?
die main-Methode wird dann doch schon längst vorbei sein


----------



## Guest (30. Jan 2009)

In dem Programm geht es darum, dass nach dem weiter-Klick ein neuer Inhalt ausgegeben wird. Dieser Klick erfolgt dann mehrmals hintereinander und jedesmal kommt ein anderer Inhalt (wie z.B. bei Windows-Assistenten). Um den richtigen Inhal einzublenden muss der Action Listener dann natürlich wissen, der wievielte Klick das war. Also zählt er mit.


----------



## Templon (30. Jan 2009)

Verwende einfach Member Variablen? ^^


----------



## SlaterB (30. Jan 2009)

wenn die zaehler-Information nur innerhalb des ActionListeners benötigt wird, ist es doch noch unverständlicher, dafür die umgebende Methode zu benutzen,
quasi als Abladeplatz für eigene Variablen..
so nicht

aber so:


```
public class Test
{
    public static void main(String[] args)
    {
        ActionListener weitergeklickt = new ActionListener() { 
            private int zaehler = 4;
            
            public void actionPerformed( ActionEvent e ) { 

            zaehler = zaehler + 1; 


            } 
        };


    }
}
```


----------



## Guest (30. Jan 2009)

Ich bin einfach zu dumm! Natürlich! Ich habe gerade Vergessen, dass man zwischen "ActionListener weitergeklickt = new ActionListener() {" und "public void actionPerformed( ActionEvent e ) {" auch Befehle etc. schreiben kann!

Danke für die schnelle Hilfe, super. Ich stand gerade auf dem Schlauch! Jetzt geht's und ich habs kapiert!


----------



## Guest (30. Jan 2009)

Eh, sorry, habe ich gerade vergessen:

Was mache ich, wenn es so einen ActionListener auch noch für "zurück" gibt. Dann muss der ja auch an die Variable!


----------



## SlaterB (30. Jan 2009)

suchs dir aus:


```
public class Test
{
    public static void main(String[] args)
    {
        final int[] zaehlerArray = new int[1];

        class WeiterAL
            implements ActionListener
        {
            private int zaehler = 4;

            public void actionPerformed(ActionEvent e)
            {
                zaehlerArray[0]++;
                zaehler++;
            }

            public void decZaehler()
            {
                zaehler--;
            }

        };

        final WeiterAL weitergeklickt = new WeiterAL();
        
        final ActionListener back = new ActionListener()
            {

                public void actionPerformed(ActionEvent e)
                {
                    zaehlerArray[0]--;
                    weitergeklickt.decZaehler();
                }

            };

    }
}
```


----------



## Gast (30. Jan 2009)

danke!


----------



## Guest (30. Jan 2009)

So, jetzt hat wirklich alles geklappt!
Nur noch eine Verständnisfrage:
Warum funktioniert das mit dem Array, wenn ich statt dessen (zum Test) jedoch eine "normale" Variable einsetze, geht es nicht. Nur zum Verständnis, ich will es ja wirklich verstehen!


----------



## HoaX (30. Jan 2009)

if würde nur einen listener machen und anhand des actionCommand entscheiden was ich darin tue


```
String ac = e.getActionCommand();
if ("AC_WEITER".equals(ac)) {
  zaehler++;
} 
else if ("AC_ZURUECK".equals(ac)) {
  zaehler--;
}
```


----------



## HoaX (30. Jan 2009)

weil du beim array den _inhalt_ des arrays änderst, das array selbst ist ja noch das gleiche. würdest du versuchen der variablen ein anderes array zuzuweisen hättest du das selbe problem wie zuvor


----------



## Guest (31. Jan 2009)

Ok, super, jetzt weiß ich bescheid! Das war schon mal bei einer Programmspielerei von mir ein Problem und ich habe einfach keine Lösung gefunden! Aber jetzt weiß ich ja wie's geht!...


----------

