ActionListener

Alpha11833

Mitglied
Hallo,

ich habe ein Problem:

Java:
private JPanel createSomePanel() {
    List<Integer> i0 = new ArrayList<>();
    Integer i1;
    irgendEinButton.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent arg0) {
         i0.add(2);  // Funktioniert
         i1 = 12;  // Funktioniert nicht
       }
     });
}


Fehler bei "Funktioniert nicht": i1 cannot be resolved or is not a field
und: Local variable i1 defined in an enclosing scope must be final or effectively final

Warum findet er die Liste i0, aber den Integer i1 nicht?


LG
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
Wenn du etwas Google-Suche betreibst, dann wirst du schnell fündig, dass dieser ActionListener auf einen äußere Scope-Variable zugreift (Closure). Es ist in der JLS niedergeschrieben, dass zwar die innere (in deinem Fall anonyme) Klasse auf äußere Variable lesend zugreifen kann, aber nicht schreiben. Bei deiner Liste änderst du nicht die Variable, sondern veränderst den Zustand. Es gibt dafür ein paar Workarounds, wie zum Beispiel ein int-Array mit Länge 1 zu verwenden, oder du nimmst die dafür vorgesehene Klassen Atomic<Primitives> (Primitives = Boolean, Integer, Double, ...).

Ein paar Sachen zum Nachlesen: JLS, SO#1, SO#2
 

Alpha11833

Mitglied
Wenn du etwas Google-Suche betreibst, dann wirst du schnell fündig, dass dieser ActionListener auf einen äußere Scope-Variable zugreift (Closure). Es ist in der JLS niedergeschrieben, dass zwar die innere (in deinem Fall anonyme) Klasse auf äußere Variable lesend zugreifen kann, aber nicht schreiben. Bei deiner Liste änderst du nicht die Variable, sondern veränderst den Zustand. Es gibt dafür ein paar Workarounds, wie zum Beispiel ein int-Array mit Länge 1 zu verwenden, oder du nimmst die dafür vorgesehene Klassen Atomic<Primitives> (Primitives = Boolean, Integer, Double, ...).

Ein paar Sachen zum Nachlesen: JLS, SO#1, SO#2
Yes Sir.. Danke! Das Problem ist manchmal, dass man nicht das richtige findet, wenn man nicht weiß, wonach man suchen muss ;) Danke, dass du das jetzt gemacht hast :)

LG
 

Ch4t4r

Aktives Mitglied
Ja, du kannst nicht das eigentliche Objekt verändern, wohl aber alle in diesem Objekt enthaltenen Objekte. Während
du ein Array in einer anonymen Klasse nicht erneut initialisieren kannst (z.B. über array = new int[]) kannst du dessen Werte ändern (array[42] = 1). Nicht anders ist es mit der Liste.
 

Zet

Aktives Mitglied
Java:
public class createSomePanel
{

    JButton irgendEinButton = new JButton();

    private JPanel createSomePanel()
    {

        final List<Integer> i0 = new ArrayList<Integer>();

        Integer i1;

        irgendEinButton.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(ActionEvent arg0)
            {
                i0.add(2); // Funktioniert

                i1 = 12; // Funktioniert nicht

            }

        });
        return null;

    }
}


i0.add(2) funktioniert bei mir nur wenn ich i0 als final deklariere.
Oder liegt es an meiner (leidergottes..) JRE 1.6?
 

Ch4t4r

Aktives Mitglied
Tut es nicht, damit stellt java sicher, dass das Objekt nicht geändert wird. Trotzdem gilt alles, was ich oben geschrieben habe.
Um das final zum umgehen, kannst du im Scope deine Liste einen weiter nach oben verschieben, also in den Sichtbarkeitsbereich der Klasse (innerhalb von

public class Klasse{
//hier
}

Dort wird kein final verlangt.
 

Flown

Administrator
Mitarbeiter
@Zet ab Java 8 (glaub ich) ist der Compiler schlau genug "effectively final" zu erkennen und man muss das final nicht extra mehr dazuschreiben.
 

Kobold137

Mitglied
Kann es daran liegen das er Integer sagt und nicht int ?
Meine das Problem auch schonmal gehabt zu haben das er einfach int will und nicht Integer

Kann es leider grad nicht selbst ausprobieren.

LG

Kobold
 

Flown

Administrator
Mitarbeiter
Also das hat jetzt nichts mit int oder Integer zu tun. Wie ich bereits sagte ist das ein Closure-Problem! Du willst aus einem anderen Scope eine Referenz setzen (bzw. bei int i1 einen neuen Wert). Das ist in Java aber nicht erlaubt, darum beschwert sich der Compiler, das nur final Variablen in einer inneren Klasse eingesetzt werden darf. Da du die Referenz der Liste - also i0 - nicht änderst, sondern deren Zustand, ist das kein Problem (in früheren Java Versionen, wie @Zet schon beschrieben hat, muss man final für alle Variablen, die in einer inneren Klasse verwendet werden, schreiben).
Klassenvariablen hingegen, können bedenkenlos geändert werden, da sie nicht im MethodenStack liegen, sondern im Heap (aber das ist wieder ein anderes Thema).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E ActionListener Java Basics - Anfänger-Themen 4
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
U HILFE! - per ActionListener Felder enablen....... Java Basics - Anfänger-Themen 5
C JButton reagiert nicht auf actionListener Java Basics - Anfänger-Themen 15
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
J Array Actionlistener Java Basics - Anfänger-Themen 9
J ActionListener von JCheckBox im Knoten von JTree funktioniert nicht Java Basics - Anfänger-Themen 2
P Erste Schritte ActionListener Java Basics - Anfänger-Themen 2
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
krgewb ActionListener Java Basics - Anfänger-Themen 1
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
T Konsolenscanner startet nicht durch Aufruf von Actionlistener Java Basics - Anfänger-Themen 4
F ActionListener mit Files etc Java Basics - Anfänger-Themen 12
N Probleme mit dem ActionListener Java Basics - Anfänger-Themen 4
CptK Auf ActionListener von anderer Klass aus zugreifen Java Basics - Anfänger-Themen 5
F Mehrere Buttons mit einem ActionListener abdecken Java Basics - Anfänger-Themen 24
U ActionListener mit JMenuItems verknüpfen Java Basics - Anfänger-Themen 1
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
L Problem bei Java-ActionListener Java Basics - Anfänger-Themen 4
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
D Einen Wert unter einen ActionListener weitergeben Java Basics - Anfänger-Themen 1
T Übernahme einer Variablen im ActionListener/ActionEvent Java Basics - Anfänger-Themen 2
JavaNewbie2.0 ActionListener Java Basics - Anfänger-Themen 11
Voreck Actionlistener problem Java Basics - Anfänger-Themen 1
G Im ActionListener eine "äußere" Variable verändern Java Basics - Anfänger-Themen 13
T Fehler beim ActionListener Java Basics - Anfänger-Themen 2
M public static int in ActionListener Java Basics - Anfänger-Themen 6
S actionlistener timer Java Basics - Anfänger-Themen 9
J Interface ActionListener in eigener Klasse Java Basics - Anfänger-Themen 27
P aus ActionListener auf HauptFrame zugreifen Java Basics - Anfänger-Themen 4
A Klassen Bool Actionlistener Java Basics - Anfänger-Themen 2
K Methoden ActionListener wird übersprungen Java Basics - Anfänger-Themen 3
S actionlistener Java Basics - Anfänger-Themen 29
S ActionListener und Statische Variablen Java Basics - Anfänger-Themen 4
J ActionListener Java Basics - Anfänger-Themen 5
R Problem mit ActionListener für Buttons Java Basics - Anfänger-Themen 5
Z ActionListener wird nicht erkannt? Java Basics - Anfänger-Themen 5
T ActionListener Source vergleichen Java Basics - Anfänger-Themen 8
T Frage zum ActionListener Java Basics - Anfänger-Themen 5
R ActionListener mit for Schleife füllen. Java Basics - Anfänger-Themen 4
K Button's mit versch. Aufgaben/ActionListener Java Basics - Anfänger-Themen 12
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
I ActionListener reagiert nicht Java Basics - Anfänger-Themen 6
N Probleme mit ActionListener und Logischer Abfrage Java Basics - Anfänger-Themen 4
D Erste Schritte Buttons mit actionlistener Problem Java Basics - Anfänger-Themen 3
S JButton mit ActionListener Java Basics - Anfänger-Themen 5
S ActionListener, Methoden und Variablen Java Basics - Anfänger-Themen 4
X Variablen Actionlistener | Variablen-namen Java Basics - Anfänger-Themen 5
G ActionListener implementieren Java Basics - Anfänger-Themen 12
T Erste Schritte Berechnete Variable im ActionListener zurückführen Java Basics - Anfänger-Themen 6
D Panel sichtbar/unsichtbar machen im ActionListener Java Basics - Anfänger-Themen 3
U JFrame durch ActionListener erweitern Java Basics - Anfänger-Themen 4
M Button , actionlistener Java Basics - Anfänger-Themen 11
P Erste Schritte JTable mit Daten aus Acces DB füllen und Actionlistener einsetzen Java Basics - Anfänger-Themen 29
M Actionlistener Java Basics - Anfänger-Themen 9
D Problem mit ausgelagertem Actionlistener Java Basics - Anfänger-Themen 4
D KeyListener und ActionListener Problem Java Basics - Anfänger-Themen 6
M Klassen Durch den ActionListener das GUI einer anderen Klasse verändern Java Basics - Anfänger-Themen 8
T NullPointerException im ActionListener Java Basics - Anfänger-Themen 3
C Erste Schritte GUI - ActionListener - Exception Nullpointer Java Basics - Anfänger-Themen 5
Kenan89 ActionListener in eigene Klasse Java Basics - Anfänger-Themen 8
E JMenu ActionListener reagiert nicht? Java Basics - Anfänger-Themen 6
V ActionListener in einer for-Schleife Java Basics - Anfänger-Themen 2
S Erste Schritte ActionListener auf Buttons einrichten Java Basics - Anfänger-Themen 3
M Variablen Variable lässt sich durch ActionListener nicht ändern Java Basics - Anfänger-Themen 5
P ActionListener Action Event Java Basics - Anfänger-Themen 5
L ActionListener zerschießt AnchorLayout Java Basics - Anfänger-Themen 8
D ActionListener braucht zwei Klicks auf Button??? Java Basics - Anfänger-Themen 2
M Methoden Timer in ActionListener aufrufen Java Basics - Anfänger-Themen 2
Y Actionlistener passt nicht zu Dataset Java Basics - Anfänger-Themen 6
W Problem mit FileWriter / ActionListener Java Basics - Anfänger-Themen 6
F actionListener Java Basics - Anfänger-Themen 3
T ActionListener auslagern Java Basics - Anfänger-Themen 14
S Actionlistener funktionieren nicht in der .jar Java Basics - Anfänger-Themen 9
E ActionListener abwarten lassen? Java Basics - Anfänger-Themen 11
E ActionListener in anderer Klasse erkennen Java Basics - Anfänger-Themen 13
H ActionListener Verbesserung möglich? (This) Java Basics - Anfänger-Themen 3
E ActionListener erkennt instanz nicht Java Basics - Anfänger-Themen 9
V ActionListener bei vielen Modulen Java Basics - Anfänger-Themen 3
J ActionListener Java Basics - Anfänger-Themen 2
T JLabel durch ActionListener ändern Java Basics - Anfänger-Themen 4
S ActionListener Java Basics - Anfänger-Themen 4
U actionListener - eine Kleine Frage Java Basics - Anfänger-Themen 7
K Actionlistener Java Basics - Anfänger-Themen 7
M ActionListener außerhalb des EDT ausführen Java Basics - Anfänger-Themen 2
A ActionListener im JMenu - Problem Java Basics - Anfänger-Themen 2
M ActionListener reagiert nicht Java Basics - Anfänger-Themen 4
N ActionListener + GUI Java Basics - Anfänger-Themen 8
H Bewegtes Bild im ActionListener [Problem] Java Basics - Anfänger-Themen 12
D Liste+ActionListener Java Basics - Anfänger-Themen 6
L wie Jframe an ActionListener übergeben Java Basics - Anfänger-Themen 4
U ActionListener und KeyListener - KeyListener funktioniert nicht Java Basics - Anfänger-Themen 2
A JButton ActionListener nach einmaligem Ausführen zurücksetzen Java Basics - Anfänger-Themen 13
Luk10 Problem mit ActionListener Java Basics - Anfänger-Themen 6
R Viereck zeichnen über TextField-Eingabe /ActionListener Java Basics - Anfänger-Themen 9
C ActionListener problem beim starten von programmen Java Basics - Anfänger-Themen 3
C ActionListener problem Java Basics - Anfänger-Themen 4
L Tray-Einträge und dazu passende ActionListener dynamisch erzeugen? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben