publicclass ACTIONSOFGUI implementsActionListener{publicvoidactionPerformed(ActionEvent e){if(e.getSource()==buttona){System.out.println("Button wurde gedrückt");}}}
Wie kann ich nun einen ActionListener in der GUI registrieren und dann in einer anderen Klasse auswerten bzw. verarbeiten?
Edit: Also genauer gesagt einfach die Frage, wie ich einen ActionListener außerhalb der GUI Klasse implementiere und auf die registrieren Objekte von der anderen Klasse zugreife.
ACTIONSOFGUI bräuchte eine Referenz auf GUI und dort müssten entsprechende getter bereit stehen.
Oder aber, du setzt einfach actionCommands (buttona.setActionCommand("buttona")) ..dann kannste in deinem Listener mit "buttona".equals(e.getActionCommand()) vergleichen.
Oder aber wenn du eh so etwas wie:
[c]buttona.addActionListener(new ACTIONSOFGUI());[/c] schreibst, könntest den Button auch einfach im Konstruktor übergeben ;D
oder oder .... How to Write an Action Listener (The Java™ Tutorials > Creating a GUI With JFC/Swing > Writing Event Listeners)
Wie könnte ich denn den Button per Konstruktor übergeben? Dann müsste ja aber doch eine Instanz von der Klasse mit den Buttons (also der GUI) erzeugt werden, denn da sind ja die Buttons drin. Aber dann müsste doch der ActionListener wie folgt registriert werden in der GUI:
buttona.addActionListener(new GUI());
Nur wie kann ich dann darauf zugreifen aus der Klasse ACTIONSOFGUI()? Ich stehe gerade auf dem Schlauch
publicclassBeispiel{publicBeispiel(){privateJButton derbutton =newJButton();}}Nun wird eine Instanz erzeugt in KlasseB:publicclassB{publicB(){privateBeispiel beispielklassenobjekt =newBeispiel();}}
Nur wie kann ich in Klasse B auf die Instanzvariable der Klasse Beispiel zugreifen?
dein Beispiel ist eher unklar zusammen mit der Frage 'Wie meinst du das mit dem Konstruktor.' da jetzt nicht mehr klar ist, wer wen erzeugt..
also wenn Beispiel die GUI sein soll, dann muss von Beispiel aus der ActionListener = B erzeugt werden,
das fehlt jetzt aber einfach mal..
im Listener bzw B. ein neues Beispiel bzw. GUI-Objekt zu erzeugen ist schlecht, das Original wird benötigt, nicht eine zweite Kopie,
der Konstruktor brauch einen Parameter, der Aufrufer muss sich selber als Parameter übergeben (new Listener(this) )
schau dir in einem beliebigen Lehrbuch an, wie man grundlegend einen Konstruktor oder auch nur eine Methode mit Parameter definiert
> Klasse B auf die Instanzvariable der Klasse Beispiel zugreifen?
so wie jeder andere Klasse auch mit ihren Instanzvariablen umgeht -> Grundlagen!
Wenn ich das richtig verstanden habe, soll die GUI eine Instanz des Listeners aufrufen.
Wäre also so etwas gemeint:
Java:
publicGUI(newACTIONSOFGUI(this));
oder wie ist es gemeint? Ich bin gerade etwas durcheinander. Denn es soll ja einfach nur in der GUI der Listener registriert werden und in einer anderen Klasse darauf zugegriffen werden.
Ich habe die Instanzvariable aber mit public static JButton derbutton in Klasse A festgelegt, nur wenn ich jetzt in Klasse B derbutton.addActionListener(new KlasseB()); mache, so wird gesagt, dass die Variable nicht bekannt ist.
> Denn es soll ja einfach nur in der GUI der Listener registriert werden und in einer anderen Klasse darauf zugegriffen werden.
den Listener registriert hattest du vorher schon
das Problem war doch, dem Listener noch die GUI bekannt zu machen,
eine Veränderung des GUI-Konstruktors ist dazu nicht nötig, beim Listner muss der Konstruktor die GUI aufnehmen, in einer Instanzvariablen speichern,
dann kannst du in Methoden dieser Klasse, wie actionPerformed() eine ist, auf die Instanzvariable, ergo die GUI, zugreifen
diese Aussage ist nicht ganz klar, es sei denn buttona.addActionListener(new ACTIONSOFGUI()); steht in einer statischen Methode,
poste bisschen Code, der vom Anfang geht sowieso nicht (statisches Attribut innerhalb einer Methode definiert)
oder verzichte ganz einfach auf static, wo immer es stört bzw. wann immer passend, wie z.B. bei Buttons in einer GUI
importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;publicclass GUI implementsActionListener{privatestaticJWindow jwind=newJWindow();...privatestaticJPanel jpan =newJPanel();...publicstaticJButton derbutton =newJButton("Button drück mich");...publicstaticvoidmain(String[] args){...
jpan.add(derbutton);...
jwind.add(jpan);...
derbutton.addActionListener(newACTIONSOFGUI());}publicvoidactionPerformed(ActionEvent e){if(e.getSource()== derbutton){// Das soll in die andere Klasse}}}
Ich habe hier einmal meinen gekürzten Code. Ich hoffe, dass hilft weiter.
Die Lösung war ja kinderleicht. Es ist so einfach gewesen, dass ich mich frage, warum ich nicht eher darauf gekommen bin.
Die Lösung ist einfach GUI.derbutton. So kann ich in der Methode ActionPerformed der Klasse ACTIONSOFGUI auf die Klassenvariable zugreifen. Ich habe einfach Instanzvariable und Klassenvariable vertauscht. Das hat mir geholfen: http://www.java-forum.org/java-basi...rschied-zwischen-klassen-instanzvariable.html
Hallo,
der Beitrag ist ja schon ein paar Jahre her.
Ich stehe vor dem gleichen Problem.
Leider funktioniert der Link im Post 12 nicht mehr.
Kann mir jemand die Lösung noch einmal studentensicher erklären?