Events

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo zusammen,

folgendes Problem.

Ich beschäftige mich zur Zeit mit Events (Java).

Ein kleines Beispiel aus einem Buch, was ich nicht ganz verstehe:

Code:
public class ButtonFrame extends JFrame implemenst ActionListener
{
    public void iniUI()
        {
          JButton button = new JButton("OK");
          button.addActionListener(this)
        }
          public void actionPerformed(ActionEvent ae)
            {
            }
}

Im Buch wird dazu folgendes ausgesagt:

Es wird zur Laufzeit mit "button.addActionListener(this)" ein Objekt der Klasse "ButtonFrame" als Ereignisempfänger
beim Objekt "button" registriert. Die Klasse des übergeordneten Objekts muss die Schnittstelle "ActionListener"
implementieren.


1. Ich dachte der Ereignisempfänger ist das Inteface, z.B. ActionListener, das Methoden zur Verarbeitung von
Ereignissen zu Verfügung stellt und diese dann implementiert werden müssten.
Warum reagiert denn die Klasse auf die Ereignisse??

2. Was hat ein Ereignistyp, wie z.B. ActionEvent mit der Schnittstelle ActionListener zu schaffen. Hängen die beiden
irgendwie zusammen?????

3. Kann man die Ereignisbehandlung Analog zu try-catch betrachten?? Wenn im try-Block ein Fehler auftaucht, wird ein Objekt erzeugt, das mit einigen Informationen ausgestatet ist aufgefangen und an den catch-Block zur weiterverarbeitung geleitet ( ob ein oder meherere catch-Blöcke vorliegen ist jetzt nicht wichtig).

Bei der Ereignisbehandlung habe ich mir etwas ähnliches vorgestellt, wie z.B. wenn auf ein Button-Objekt, an dem
einen ActionListener angemeldet ist geklickt wude, wird ein Objekt erzeugt, das Informationen über das Ereignis enthält
und an die Methode "public void actionPerformed(ActionEvent ae), die ein Obejkt vom Typ ActionEvent aufnimmt übergeben
wird und dann innerhalb der Methode, wie bei catch der Block ausgeführt wird.
Aber da kommt dieses "this" ins Spiel, was ich da nicht verstehe :bahnhof:

Ich hoffe, ich konnte mein kleines Problem einigermaßen deutlich erklären, ???:L

danke im voraus, monet
 

Marco13

Top Contributor
Deine Zusammenfassung am Ende war so richtig, dass ich mich Frage, warum du die Fragen überhaupt gestellt hast ???:L

1. Ich dachte der Ereignisempfänger ist das Inteface, z.B. ActionListener, das Methoden zur Verarbeitung von
Ereignissen zu Verfügung stellt und diese dann implementiert werden müssten.
Warum reagiert denn die Klasse auf die Ereignisse??

Weil sie ein ActionListener IST (durch das "implements ActionListener"). Man kann bei "addActionListener" jedes beliebige Objekt übergeben, solange seine Klasse "implements ActionListener" hat, und damit die Methode "actionPerformed(ActionEvent e)" anbietet. Der Button braucht über das übergebene Objekt NICHTS zu wissen, NUR dass es diese Methode anbietet - und das ist durch das "implements ActionListener" zugesichert.

2. Was hat ein Ereignistyp, wie z.B. ActionEvent mit der Schnittstelle ActionListener zu schaffen. Hängen die beiden
irgendwie zusammen?????

Ja, insofern, dass jede Klasse, die "implements ActionListener" ist, eine Methode "actionPerformed(ActionEvent e)" anbietet.

3. Kann man die Ereignisbehandlung Analog zu try-catch betrachten?? Wenn im try-Block ein Fehler auftaucht, wird ein Objekt erzeugt, das mit einigen Informationen ausgestatet ist aufgefangen und an den catch-Block zur weiterverarbeitung geleitet ( ob ein oder meherere catch-Blöcke vorliegen ist jetzt nicht wichtig).
Nein ... nicht direkt. Aus... theoretischer Sicht könnte man gewisse "Parallelen" sehen, aber sprachlich ist es schon SEHR unterschiedlich.

Etwas (nur wenig) vereinfacht kann man sich die Sache mit den ActionListenern bei einem Button etwa so vorstellen:
Code:
class Button
{
    private List<ActionListener> actionListeners = new ArrayList<ActionListener>();

    public void addActionListener(ActionListener a) { actionListeners.add(a); }

    public void ichWurdeAngeklickt()
    {
        ActionEvent event = new ActionEvent("....");
        for (ActionListener actionListener : actionListeners) actionListener.actionPerformed(event);
    }
}
 
G

Guest

Gast
Hi,
danke für die schnelle Antwort.


Man kann bei "addActionListener" jedes beliebige Objekt übergeben, solange seine Klasse "implements ActionListener" hat, und damit die Methode "actionPerformed(ActionEvent e)" anbietet
1. Also könnte ich das auch so schreiben: "okbuton.addActionListener(this.okbutton)" ??

Nein ... nicht direkt. Aus... theoretischer Sicht könnte man gewisse "Parallelen" sehen, aber sprachlich ist es schon SEHR unterschiedlich.
2. Sorry, habe mich vielleicht falsch ausgedrückt. Ich meinte nur vom "Prinzip" her Analog zu tray-catch.

Weil sie ein ActionListener IST (durch das "implements ActionListener"). Man kann bei "addActionListener" jedes beliebige Objekt übergeben, solange seine Klasse "implements ActionListener" hat, und damit die Methode "actionPerformed(ActionEvent e)" anbietet. Der Button braucht über das übergebene Objekt NICHTS zu wissen, NUR dass es diese Methode anbietet - und das ist durch das "implements ActionListener" zugesichert.

3. Also, ich habe das so verstanden:
Die "normale" Klasse (z.B. class Auto) wird durch die Implementierung von "implements ActionListener" und die implementierung der notwendigen Methode (hier dann "public void actionPerformed(AcetionEvent ae)
zum "Wächter" eines möglichen Ereignisses, dass z.B. durch einen Button ausgelößt werden kann.

2. Was hat ein Ereignistyp, wie z.B. ActionEvent mit der Schnittstelle ActionListener zu schaffen. Hängen die beiden
irgendwie zusammen?????
Ja, insofern, dass jede Klasse, die "implements ActionListener" ist, eine Methode "actionPerformed(ActionEvent e)" anbietet.
4. Das habe ich leider nicht ganz verstanden, was Du damit meintest. Kannst Du mir vielleicht Quellen sagen, wo ich
das nachschlagen könnte??

Danke, monet
 

Marco13

Top Contributor
1. Also könnte ich das auch so schreiben: "okbuton.addActionListener(this.okbutton)" ??
Nein. "this.okbutton" ist ja vmtl. ein Objekt vom Typ "JButton". Und JButton hat NICHT das benötigte "implements ActionListener" bzw. die Methode "actionPerformed".


Die "normale" Klasse (z.B. class Auto) wird durch die Implementierung von "implements ActionListener" und die implementierung der notwendigen Methode (hier dann "public void actionPerformed(AcetionEvent ae)
zum "Wächter" eines möglichen Ereignisses, dass z.B. durch einen Button ausgelößt werden kann.


Genau. Als Beispiel:
Code:
class Foo implements ActionListener
{
    // Compilerfehler: Die Methode "actionPerformed" fehlt
}

// Läßt sich compileren - aber man sieht von außen nicht, 
// dass die methode "actionPerformed" vorhanden ist,
// weil das "implements ActionListener" fehlt. D.h. man
// kann Objekte dieser Klasse NICHT als ActionListener
// verwenden
class Bar 
{
     public void actionPerformed(ActionEvent e) { ... } 
}

// Funktioniert: Jeder sieht, dass das ein ActionListener 
// ist (wegen "implements") und damit die Methode 
// "actionPerformed" anbieten muss
class FooBar implements ActionListener
{
     public void actionPerformed(ActionEvent e) { ... } 
}

...
    // someButton.addActionListener(new Foo()); // Hinfällig, wegen Compilerfehler oben
    //someButton.addActionListener(new Bar()); // Geht nicht: Man "weiß nicht", dass Bar die Methode actionPerformed hat
    someButton.addActionListener(new FooBar()); // Geht: FooBar ist ein ActionListener und hat die actionPerformed-Methode


4. Das habe ich leider nicht ganz verstanden, was Du damit meintest. Kannst Du mir vielleicht Quellen sagen, wo ich
das nachschlagen könnte??


Hm :? bei irgendwelchen Fragen zu Swing muss man eigentlich nur
"How to" XXX
in eine Suchmaschine eintippen, und landet bei
"How to" ActionListener
sofort auf http://java.sun.com/docs/books/tutorial/uiswing/events/actionlistener.html ....
 
G

Guest

Gast
1. Also könnte ich das auch so schreiben: "okbuton.addActionListener(this.okbutton)" ??
Nein. "this.okbutton" ist ja vmtl. ein Objekt vom Typ "JButton". Und JButton hat NICHT das benötigte "implements ActionListener" bzw. die Methode "actionPerformed".

Ach so, nur ein Objekt vom Typ einer Klasse,die das passende ActionListener-Interface implementiert wird mit
dem Typ des Objekts "verbunden", dass das Ereignis ausglöst hat.

Dein Beispiel ist echt gut :D

Code:
class Foo implements ActionListener
{
    // Compilerfehler: Die Methode "actionPerformed" fehlt
}

// Läßt sich compileren - aber man sieht von außen nicht,
// dass die methode "actionPerformed" vorhanden ist,
// weil das "implements ActionListener" fehlt. D.h. man
// kann Objekte dieser Klasse NICHT als ActionListener
// verwenden
class Bar
{
     public void actionPerformed(ActionEvent e) { ... }
}

// Funktioniert: Jeder sieht, dass das ein ActionListener
// ist (wegen "implements") und damit die Methode
// "actionPerformed" anbieten muss
class FooBar implements ActionListener
{
     public void actionPerformed(ActionEvent e) { ... }
}

...
    // someButton.addActionListener(new Foo()); // Hinfällig, wegen Compilerfehler oben
    //someButton.addActionListener(new Bar()); // Geht nicht: Man "weiß nicht", dass Bar die Methode actionPerformed hat
    someButton.addActionListener(new FooBar()); // Geht: FooBar ist ein ActionListener und hat die actionPerformed-Methode

Ich glaube, jetzt ist der Cent gefallen. Wenn eine Klasse ein Interface implementiert,dann kann ein Objekt der Klasse auf Methoden des Interface zugreifen bzw. die Klasse muss alle Methoden des Interface implementieren, da diese abstrakt sind.
1. Wenn jetzt die Button-Instanz ein Ereignis auslöst, wird ein Objekt vom Typ der Klasse, z.B. Auto oder wie in deinem Beispiel "new FooBar()" erzeugt und mit Informationen über den Ereignistyp der Methode "public void actionPerformed(ActionEvent ae)" übergeben, da diese ja als Argument so einen Typ erwartet.
Ist es bis hier richtig??
Mir ist noch nicht ganz klar, was dann passiert und wo "ActionEvent" ins Spiel kommt????


Wenn ich das jetzt richtig verstanden habe, dann könnte ich die Zeile 28 auch so schreiben??

Code:
class Auto implements ActionListener{

........ okbutton.addActionListener(opel);// Instanz der Klasse Auto


Auto opel = new Auto()
}

danke, monet
 

Marco13

Top Contributor
Ich glaube, jetzt ist der Cent gefallen. Wenn eine Klasse ein Interface implementiert,dann kann ein Objekt der Klasse auf Methoden des Interface zugreifen bzw. die Klasse muss alle Methoden des Interface implementieren, da diese abstrakt sind.
Ja.


1. Wenn jetzt die Button-Instanz ein Ereignis auslöst, wird ein Objekt vom Typ der Klasse, z.B. Auto oder wie in deinem Beispiel "new FooBar()" erzeugt und mit Informationen über den Ereignistyp der Methode "public void actionPerformed(ActionEvent ae)" übergeben, da diese ja als Argument so einen Typ erwartet.
Ist es bis hier richtig??

Nein, nicht so ganz. Das, was dort bei addActionListener übergeben wird, ist nur der Listener - d.h. der wird i.a. nicht bei jedem Event neu erzeugt. Er wird EINmal registriert, und bekommt dann bei jedem Klick ein ActionEvent-Objekt an seine actionPerformed-Methode übergeben.


Mir ist noch nicht ganz klar, was dann passiert und wo "ActionEvent" ins Spiel kommt????


Schau nochmal die Button-Klasse aus meiner ersten Antwort an: Dort wird bei addActionListener irgendein ActionListener übergeben (entweder ein "new FooBar()", oder ein 'opel', aus deinem letzen Beispiel). Der wird gespeichert. Sobald der Button geklickt wurde, wird ein ActionEvent erstellt. Dieser ActionEvent wird ALLEN registrierten ActionListenern übergeben, indem für jeden ActionListener die Methode "actionListener.actionPerformed(event);" aufgerufen wird (die er ja anbieten MUSS, weil er ja ein ActionListener ist).



Wenn ich das jetzt richtig verstanden habe, dann könnte ich die Zeile 28 auch so schreiben??
[... code ...]


Ja, das stimmt so auch.


Nochmal einen Schritt zurück: Die ganze Sache mit den Interfaces und Listenern dient dem Zweck, eine gewisse Flexibilität zu schaffen. Man hat einen Button, und übergibt dem bei "addActionListener" irgendeinen ActionListener. WAS das genau für ein Objekt ist, weiß man nicht, aber man weiß eins: Es ist ein ActionListener, und es bietet demnach eine Methode "actionPerformed" an. Der Zusatz "...implements ActionListener" ist sozusagen das "Versprechen", dass es diese Methode gibt.

Die Alternative wäre ja irgendwas überspezialisiertes:
Code:
class MeineGanzSpezielleKlasseFürDenOKButton
{
    void derOKButtonWurdeGeklickt() { .... }
}

class MeinOKButton
{
    private MeineGanzSpezielleKlasseFürDenOKButton meinGanzSpeziellesObjektFürDenOKButton;

    void legeFestWasBeiEinemKlickGemachtWerdenSoll(MeineGanzSpezielleKlasseFürDenOKButton x)
    {
        meinGanzSpeziellesObjektFürDenOKButton= x;
    }

    public void ichWurdeAngeklickt()
    {
        meinGanzSpeziellesObjektFürDenOKButton.derOKButtonWurdeGeklickt();
    } 
}

Mit Hilfe des allgemeinen, abstrakten Listener-Konzepts hat man "irgendeinen" Button, und der kann "irgendwelche" ActionListener haben. Man kann z.B. an einen Button auch mehrere ActionListener hängen, die alle unterschiedliche Sachen machen. Man kann auch ein und denselben ActionListener an mehrere Buttons hängen. Und wenn man später feststellt, dass beim Klick auf den OK-Button irgendwas anderes gemacht wurde, muss man am Button selbst nichts ändern. Man muss nur einen anderen ActionListener dranhängen.
 
G

Guest

Gast
Hi,

danke erstmal für deine Mühe :toll:

....Dort wird bei addActionListener irgendein ActionListener übergeben (entweder ein "new FooBar()", oder ein 'opel', aus deinem letzen Beispiel). Der wird gespeichert. Sobald der Button geklickt wurde, wird ein ActionEvent erstellt.....

Wird das Objekt "opel" dann in der Klasse ActionEvent gespeichert oder geht es noch höher in die Klasse EventObjekt??? Wenn ja, dann stelle ich mir das so vor, dass das übergebene Objekt "opel", welches sich in okbutton.addActionListener(opel)" befindet an die Klasse ActionEvent übergeben und dort gespeichert wird.
Wenn nun der Button "okbutton" angeklickt wird, wird ein Objekt vom Typ ActionEvent an die Methode "public void
actionPerformed(ActionEvent ae)" übergeben :shock: und dann wird die Methode bzw. der Block ausgeführt.
Ich hoffe das stimmt so :roll:

1. Wenn jetzt die Button-Instanz ein Ereignis auslöst, wird ein Objekt vom Typ der Klasse, z.B. Auto oder wie in deinem Beispiel "new FooBar()" erzeugt und mit Informationen über den Ereignistyp der Methode "public void actionPerformed(ActionEvent ae)" übergeben, da diese ja als Argument so einen Typ erwartet.
Ist es bis hier richtig??

Nein, nicht so ganz. Das, was dort bei addActionListener übergeben wird, ist nur der Listener - d.h. der wird i.a. nicht bei jedem Event neu erzeugt. Er wird EINmal registriert, und bekommt dann bei jedem Klick ein ActionEvent-Objekt an seine actionPerformed-Methode übergeben.
Mit "Nein, nicht so ganz", meinst Du damit, dass es nicht an die Methode "public void
dirket übergeben, sondern an die Klasse "ActionEvent". :?, die ein Objekt vom Typ ihrer Klasse an die Methode übergibt!?!?!

Ich glaube, ich sehe den Wald vor lauter Bäumen nicht :autsch:

Danke, monet
 
G

Gast

Gast
Alles klar,

danke nochmals. Jetzt habe ich schon mal einen guten Ansatz!!!!

Gruß monet
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Ical4j - Lazy Loading von Events? Java Basics - Anfänger-Themen 2
D Events verarbeiten Java Basics - Anfänger-Themen 1
nonickatall Erste Schritte Events Dokumentation/Tutorial Java Basics - Anfänger-Themen 1
K die Source eines Events bei verschiedenen Quellen herausfinden Java Basics - Anfänger-Themen 1
M Best Practice Events für jeden, oder für die Allgemeinheit "registrieren"? Java Basics - Anfänger-Themen 5
O Wie Log4J - Ausgaben/Events auffangen?! Java Basics - Anfänger-Themen 3
Thallius Best Practice Events zwischen eigenen Klassen Java Basics - Anfänger-Themen 2
G Events schreiben, solange Programm läuft Java Basics - Anfänger-Themen 6
H [JAVA] NetBeans GUI Builder - Events Java Basics - Anfänger-Themen 10
G Erste Schritte Window Events in Java Java Basics - Anfänger-Themen 6
Y Events auslösen Java Basics - Anfänger-Themen 11
T fenster schliesen und mouse events in einer nicht abstrakten klasse Java Basics - Anfänger-Themen 6
S Dauer eines Events anhandUnterschied berechnen? Java Basics - Anfänger-Themen 3
Nicer Maus Events Java Basics - Anfänger-Themen 2
H Listener und Events entfernen Java Basics - Anfänger-Themen 2
R wieso Nullpoint und was mit Events ? Java Basics - Anfänger-Themen 14
F Reihenfolge in der Events abgearbeitet werden Java Basics - Anfänger-Themen 2
Luk10 Problem mit vielen Timer(-Events) Java Basics - Anfänger-Themen 17
B Events behandeln Java Basics - Anfänger-Themen 4
A Events werfen/feuern wenn bestimtm methode ausgeführt wird Java Basics - Anfänger-Themen 3
E import org.eclipse.swt.Events.PaintListener; Java Basics - Anfänger-Themen 1
M Urheber von Events ermitteln Java Basics - Anfänger-Themen 5
S Eigene Events werfen? Java Basics - Anfänger-Themen 6
G Events manuell aulösen Java Basics - Anfänger-Themen 3
C Listener und Events Java Basics - Anfänger-Themen 10
D Events nicht bei den jeweiligen Objekten? Java Basics - Anfänger-Themen 3
G PropertyChangeListener empfängt Events doppelt Java Basics - Anfänger-Themen 5
F Eigene Klasse für Events Java Basics - Anfänger-Themen 10
S Keylistener-Events hochreichen Java Basics - Anfänger-Themen 4
H Problem mit Events bzw. Referenzen Java Basics - Anfänger-Themen 4
H Events Java Basics - Anfänger-Themen 5
G Loop blockt alle Events Java Basics - Anfänger-Themen 7
D Probleme mit key events Java Basics - Anfänger-Themen 6
S Events Java Basics - Anfänger-Themen 11
S MouseListener - Events auf Mouseklick Java Basics - Anfänger-Themen 14
D Events Java Basics - Anfänger-Themen 4
G Events Java Basics - Anfänger-Themen 2
E Events nicht an aufrufendes Objekt schicken Java Basics - Anfänger-Themen 23
R events . usw Java Basics - Anfänger-Themen 6
S winXP -> window-events Java Basics - Anfänger-Themen 2
D [Problem] Events Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben