addActionListener

Status
Nicht offen für weitere Antworten.

DR

Bekanntes Mitglied
Hallo,

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

Code:
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
 

DR

Bekanntes Mitglied
Code:
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
 
B

Beni

Gast
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

Bekanntes Mitglied
Also fangen wir mal an:

Hier hab ich bis jetzt den AL:

Code:
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:

Code:
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:

Code:
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.
 
B

Beni

Gast
"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:
Code:
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

Top Contributor
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
Code:
private static void setzeActionListener( JMenuItem item, java.awt.event.ActionListener al )
heißen.
 

DR

Bekanntes Mitglied
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

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

Hier die Klasse für MenuItems:
Code:
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 ;) ):

Code:
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

Bekanntes Mitglied
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
 

DR

Bekanntes Mitglied
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

Top Contributor
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

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

Code:
private static JMenuItem starteSimon;

ist alles okay.

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

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

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

Beni

Gast
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.

Code:
public class Single{
  public static int x;
}
Code:
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

Bekanntes Mitglied
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

Code:
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

Top Contributor
Benutz die main nur um die Hauptklasse zu erzeugen und eventuell sichtbar zu machen.
Der Rest kommt dann in den Konstruktor :wink:
Code:
...
public class Hauptklasse extends JFrame {
    public Hauptklasse() {	//Konstruktor
...
    }
...
    public static void main(String args[]) {
        new Hauptklasse().setVisible(true);
    }
...
}
 

DR

Bekanntes Mitglied
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
 

DR

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
DR hat gesagt.:
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.
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

Bekanntes Mitglied
Code:
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

Top Contributor
Code:
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();
  }
}
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben