# addActionListener



## DR (1. Jul 2006)

Hallo,

Also ich habe eine Methode, die meinem JMenuItem einen ActionListener übergibt:


```
private static void setzeActionListener( JMenuItem item, ActionListener al ){
  item.addActionListener( al );
}
```

Aber irgendwie kommt da nur ein Fehler:



> No applicable overload for a method with signature "addActionListener(ActionListener)" was found in type "javax.swing.AbstractButton". Perhaps you wanted the overloaded version "void addActionListener(java.awt.event.ActionListener $1);" instead?



Ich werde da irgendwie nicht schlau draus. Kann mir vll jemand sagen was ich falsch mache? Wäre echt sehr nett 

MfG DR


----------



## L-ectron-X (1. Jul 2006)

```
item.addActionListener(this);
```


----------



## DR (1. Jul 2006)

```
private static void setzeActionListener( JMenuItem item, ActionListener al ){
  item.addActionListener( this );
}
```



> A "this" expression may only be used in the body of an instance method, constructor (after the explicit constructor invocation, if any), initializer block, or in the initializer expression of an instance variable.



Das geht nicht ...  ???:L


----------



## Beni (1. Jul 2006)

Das kleine Codestück das du gepostet hast, funktioniert bei mir. Wahrscheinlich ist der Fehler bei einem anderen Codestück. Kopier mal genau soviel aus deinem Code, dass man den Fehler reproduzieren kann.


----------



## DR (1. Jul 2006)

Also fangen wir mal an:

Hier hab ich bis jetzt den AL:


```
public static ActionListener erstelleStarteSimonAL( final JFrame frame ){
    starteSimon = new ActionListener(){
      public void actionPerformed( ActionEvent e ){

      }
    };
    return starteSimon;
  }
```

Hier ist der Ort, indem die Methode aufgerufen wird:


```
private static JMenuItem starteSimon;

public static void erstelleStarteSimon( JFrame frame, JMenu datei ){
    starteSimon = new JMenuItem( "Starte Simon" );
    setzeIcon( frame, starteSimon, "simon.png" );
    setzeAccelerator( starteSimon, 'S' );
    setzeActionListener( starteSimon, ActionListener.erstelleStarteSimonAL(frame) );
    datei.add( starteSimon );
  }
```

Und hier die Bekannte Methode:


```
private static void setzeActionListener( JMenuItem item, ActionListener al ){
    item.addActionListener( this );
  }
```

Wobei man sagen muss, dass der AL in einer anderen Klasse aufgerufen wird, wie man auch beim Aufruf der Methode "setzeActionListener" sieht. 
Und es geht auch nicht, wenn ich den Aufruf der Methode "setzeActionListener" auskommentiere.


----------



## Beni (1. Jul 2006)

"starteSimon = new ActionListener..." ist ein bisschen komisch, schliesslich ist "starteSimon" kein ActionListener sondern ein JMenuItem. Auch "ActionListener.erstelle..." ist seltsam, du hast deine Klasse doch hoffentlich nicht selbst "ActionListener" genannt? Dann würde sie nämlich das Interface ActionListener verdecken, und der Fehler liese sich erklären.

Auf jeden Fall: wenn man deinen Code zusammenkopiert, funktioniert alles:

```
public class Test2{
    private static JMenuItem starteSimon;

    public static ActionListener erstelleStarteSimonAL( final JFrame frame ){
        ActionListener listener = new ActionListener(){
            public void actionPerformed( ActionEvent e ){

            }
        };
        return listener;
    }

    public static void erstelleStarteSimon( JFrame frame, JMenu datei ){
        starteSimon = new JMenuItem( "Starte Simon" );
        //setzeIcon( frame, starteSimon, "simon.png" );
        //setzeAccelerator( starteSimon, 'S' );
        setzeActionListener( starteSimon, erstelleStarteSimonAL(frame) );
        datei.add( starteSimon );
    }


    private static void setzeActionListener( JMenuItem item, ActionListener al ){
        item.addActionListener( al );
    }
}
```

P.S. Ich frage dich _nicht_, wieso du alles "static" gemacht hast. Das ist irgendeine Krankheit die ich nicht begreiffe, aber solange du weisst, was "static" bedeutet... du weisst doch, was "static" bedeutet?


----------



## Illuvatar (1. Jul 2006)

Ich würde ziemlich sicher vermuten, dass es so ist, wie Beni sagte: Du hast eine deiner Klassen ActionListener genannt. Das kann nun mal nicht funktionieren  Entweder du benennst deine Klasse um, oder deine setzeActionListener Methode muss

```
private static void setzeActionListener( JMenuItem item, java.awt.event.ActionListener al )
```
heißen.


----------



## DR (2. Jul 2006)

Ich kapier das irgendwie nicht, wenn ich die Methoden in 'Test2' in eine eigene Klasse kopiere, geht es. Aber wenn ich die gleichen Methoden in mein Programm einfüge, dann geht es nicht mehr. Selbst wenn ich auch alles, außer die Methoden die ich schon geschrieben habe auskommentiere, geht es nicht. 
Daraus lasst sich schließen: *Ich bin zu dumm*, oder *Java ist Unlogisch*

PS zurück: Auch wenn du mich nicht fragst, ich antworte dir trotzdem  ... Also da kommt halt immer, dass die Methode in diesem statischen Kontext nicht geht (oder so) und dann mach ich es halt immer static ... 
Frage 1: Was heißt static? 
Frage 2: Wie kann ich das Umgehen?


----------



## DR (2. Jul 2006)

So jetzt nochmal zum nachschauen, dass sind meine Klassen, welche relevant sind:

Hier die Klasse für MenuItems:

```
import java.awt.*;
import javax.swing.*;

public class MenuItem{

  private static JMenuItem starteSimon;
  private static ActionListener starte;

 
  public static void erstelleStarteSimon( JFrame frame, JMenu datei ){
    starteSimon = new JMenuItem( "Starte Simon" );
    setzeIcon( frame, starteSimon, "simon.png" );
    setzeAccelerator( starteSimon, 'S' );
    setzeActionListener( starteSimon, Act.erstelleStarteSimonAL(frame) );
    datei.add( starteSimon );
  }
  
  
  private static void setzeIcon( JFrame frame, JMenuItem item, String name ){
    item.setIcon( new ImageIcon(frame.getClass().getResource("/Images/" + name)) );
  }
  

  private static void setzeAccelerator( JMenuItem item, char buchstabe ){
    item.setAccelerator( KeyStroke.getKeyStroke(buchstabe, InputEvent.CTRL_MASK) );
  }

  private static void setzeActionListener( JMenuItem item, ActionListener al ){
    item.addActionListener( al );
  }
}
```

und die Klasse Act (Name wurde geändert  ):


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Act{

  private static ActionListener starteSimon;

  public static ActionListener erstelleStarteSimonAL( final JFrame frame ){
    starteSimon = new ActionListener(){
      public void actionPerformed( ActionEvent e ){

      }
    };
    return starteSimon;
  }
}
```


----------



## DR (2. Jul 2006)

Okay jetzt kapiere ich Java nicht mehr ... Ich drücke die ganze Zeit aus den Compiler und plötzlich geht es ...  ???:L 

Aber kann mir jmd noch die Frage beantworten, mit static?

MfG DR


----------



## André Uhres (2. Jul 2006)

DR hat gesagt.:
			
		

> Frage 1: Was heißt static?


http://www.java-forum.org/de/viewtopic.php?t=1531



			
				DR hat gesagt.:
			
		

> Frage 2: Wie kann ich das Umgehen?


Das Attribut static für Methoden und Variablen weglassen  :wink:


----------



## DR (2. Jul 2006)

Kann mirl, wenn wir gerade bei dem Thema sind, jemand erklären, was dann ein statischer Kontext ist, und wie man den Umgehen kann?


----------



## Wildcard (2. Jul 2006)

Ein statischer Kontext ist zB. eine statische Methode. Eine statische Methode ist nicht an ein Objekt sondern an die Klasse gebunden und daher kann man von dort aus auch nicht auf Instanz-Variabeln eines Objekts zugreifen (weil die Methode ja gar keine Instanz der Klasse kennt).
'Umgehen' kann man das in dem man static nicht verwendet  :wink:


----------



## DR (2. Jul 2006)

Ja aber wenn ich jetzt zum Beispiel mein JMenuItem starteSimon habe:


```
private static JMenuItem starteSimon;
```

ist alles okay.

Aber jetzt mache ich einfach das static weg und überall, wo ich starteSimon benutze kommt dann:


```
The field "starteSimon" is not static, and cannot be accessed in this static context.
```

Also wie soll ich es dann einfach weglassen?  ???:L


----------



## Wildcard (2. Jul 2006)

Du versucht von irgendeiner statischen Methode darauf zuzugreifen, und das geht eben nicht.


----------



## Beni (2. Jul 2006)

Das grosse Problem an static ist: du sagst damit, dass es auf der ganzen Welt nur ein einziges "starteSimon"-JMenuItem geben kann. Das mag vielleicht für dein Programm noch stimmen, aber wenn du das in einer anderen Klasse einsetzt, von der du mehr als eine Instanz benötigst, wirst du grosse Probleme bekommen.


```
public class Single{
  public static int x;
}
```


```
Single a = new Single();
Single b = new Single();

a.x = 12;
b.x = 34;

System.out.println( a.x ); // das wird 34 sein, obwohl die Intuition 
// sagt, dass es 12 sein sollte. "Schuld" daran ist das static
```


----------



## DR (2. Jul 2006)

Alles schön und gut ... ich verstehe euch voll und ganz, aber lasse ich mal alle static's weg, dann kommt immer, wenn ich bei einer Methode eine andere Methode zugreife wieder:




> The method "erstelleStarteSimonAL" is not static, and cannot be accessed in this static context.



Dann mach ich auch alle anderen Methoden, bis zu


```
public static void main ( String[] args )
```

weg, aber trotzdem kommt immer wieder dass mit dem "static context" und ich kapiere euch immernoch nicht mit dem "einfach weglassen", weil einfach weglassen kann ich es einfach nicht ...


----------



## André Uhres (2. Jul 2006)

Benutz die main nur um die Hauptklasse zu erzeugen und eventuell sichtbar zu machen. 
Der Rest kommt dann in den Konstruktor  :wink:

```
...
public class Hauptklasse extends JFrame {
    public Hauptklasse() {	//Konstruktor
...
    }
...
    public static void main(String args[]) {
        new Hauptklasse().setVisible(true);
    }
...
}
```


----------



## DR (2. Jul 2006)

Hmm ich habe jetzt alles im Konstruktor, und bei mir steht nirgendwo auch nur Ansatzweise ein static aber trotzdem will das mit dem "static kontext" nicht weg ...
Entweder ich bin zu dumm, oder das Programm ist zu schlau  ???:L


----------



## André Uhres (2. Jul 2006)

Der Compiler sagt dir an welcher Zeile es liegt..


----------



## DR (2. Jul 2006)

Ja wenn ich die Klasse mit meinem ActionListener compiliere dann kommt kein Fehler.
Wenn ich die Klasse mit der Methode, die den ActionListener aufruft, compiliere, dann kommt der alte "static context".
Und in der anderen Klasse wo dann diese Methode aufgeruft wird, kommt dann das gleiche.
Und dann, wenn ich die Methode im Konstruktor aufrufe, kommt dann auch das gleiche. 
Aber wenn ich die ActionListener-Methode auskommentiere, dann fängt das gleiche Spiel wieder an, nur nicht mit der AL-Methode ???:L


----------



## André Uhres (2. Jul 2006)

DR hat gesagt.:
			
		

> J..Wenn ich die Klasse mit der Methode, die den ActionListener aufruft, compiliere, dann kommt der alte "static context".
> Und in der anderen Klasse wo dann diese Methode aufgeruft wird, kommt dann das gleiche.
> Und dann, wenn ich die Methode im Konstruktor aufrufe, kommt dann auch das gleiche.
> Aber wenn ich die ActionListener-Methode auskommentiere, dann fängt das gleiche Spiel wieder an, nur nicht mit der AL-Methode ???:L


Könntest zu die entsprechenden Fehlermeldungen wortwörtlich zitieren?


----------



## DR (2. Jul 2006)

Natürlich 



> The method "erstelleStarteSimonAL" is not static, and cannot be accessed in this static context.





> The method "erstelleStarteSimon" is not static, and cannot be accessed in this static context.



Und im Konstruktor dann:



> The method "erstelleMenu" is not static, and cannot be accessed in this static context.
> The method "erstelleFenster" is not static, and cannot be accessed in this static context.
> The method "erstelleStarteSimon" is not static, and cannot be accessed in this static context.
> The method "erstelleStarteSimonAL" is not static, and cannot be accessed in this static context.


----------



## André Uhres (2. Jul 2006)

DR hat gesagt.:
			
		

> Und im Konstruktor dann:
> 
> 
> 
> ...


Kannst du mal den Konstruktor posten?

Oder machst du etwa die Aufrufe so:
Klassenname.methode()
Das wären statische Aufrufe, das geht natürlich dann nicht  :wink:


----------



## DR (2. Jul 2006)

```
import java.awt.*;
import javax.swing.*;

public class Simon{
  public Simon(){
    JFrame frame = new JFrame ( "SIMON!" );
    Menu.erstelleMenu( frame );
    Fenster.erstelleFenster( frame );
  }

  public static void main ( String[] args ){
    new Simon();
  }
}
```


----------



## André Uhres (2. Jul 2006)

Siehe mein voriger Post, rote Schrift...


----------



## DR (2. Jul 2006)

Und wie wird es zu einem nicht-statischen Aufruf?  ???:L


----------



## André Uhres (2. Jul 2006)

```
import java.awt.*;
import javax.swing.*;

public class Simon{
  public Simon(){
    JFrame frame = new JFrame ( "SIMON!" );
    Menu m = new Menu();
    m.erstelleMenu( frame );
    Fenster f = new Fenster();
    f.erstelleFenster( frame );
  }

  public static void main ( String[] args ){
    new Simon();
  }
}
```


----------



## DR (2. Jul 2006)

das war's  
danke ... 
MfG DR


----------

