Wie aus eigener Klasse Events senden?

Um mit einer Canvas-Subklasse ein eigenes GUI-Element realisieren zu
können (siehe Bsp. cButton), möchte ich daraus Events abfeuern
können, wie es die AWT-Standard-Dialogelemente auch tun. Ich dachte,
das müsse doch eine grundlegende „every day task“ sein. Jedoch
konnten mir weder Kollegen, Google noch Bücher weiterhelfen. Nun
ist’s an euch! :wink:

Dieses Applet setzt das GUI-Element ein und soll davon ein
ActionEvent empfangen:

public class CustomButtonTest extends Applet implements 
ActionListener {

cButton cb;

public void init() {
 cb = new cButton(80,80,new Color(205,20,0));
 add(cb);
 // bei cButton irgendwie für Event-Empfang registrieren
 cb.addActionListener(this);
}

// dieser Event-Handler soll dann von cButton gefeuert werden
public void actionPerformed(ActionEvent e) { Aktion }

cButton verarbeitet MouseEvents und soll am Schluss ein ActionEvent
absetzen:

public class cButton extends Canvas implements MouseListener {

 public cButton(int width, int height, Color col) {
 ...
 addMouseListener(this);
 }

 public void paint (Graphics g) { Zeichnen }

 // muss ich das so selber schreiben?
 public void addActionListener(ActionListener l) {
 // was tun?
 }

 public void mouseClicked(MouseEvent e) {
 // hier soll das ActionEvent an registrierte Interessenten 
 // abgefeuert werden
 // villeicht irgendwie so?
 dispatchEvent(new ActionEvent(this, AWTEvent.RESERVED\_ID\_MAX + 
1, ""));
 }
 // weitere Event-Handler

Ich hoffe es wird einigermassen klar, worauf ich hinaus will.
Irgendwelche Ideen?

Hallo,

> public void addActionListener(ActionListener l) {  
> // was tun?  
> }

den ActionListener in einer Klassenvariablen hinterlegen

 private ActionListener listener;

 public void addActionListener(ActionListener listener)
 {
 this.listener = listener;
 }






> public void mouseClicked(MouseEvent e) {  
> // hier soll das ActionEvent an registrierte Interessenten  
> // abgefeuert werden  
> // villeicht irgendwie so?  
> dispatchEvent(new ActionEvent(this, AWTEvent.RESERVED\_ID\_MAX  
> +  
> 1, ""));  
> }

und jetzt dessen actionPerformed Methode aufrufen

 public void mouseClicked(MouseEvent e)
 {
 ActionEvent event = new ActionEvent(this, 42, "ActionCommand");
 listener.actionPerformed(event);
 }

gruß
Heavy

private ActionListener listener;

public void addActionListener(ActionListener listener)
{
this.listener = listener;
}

ist so allerdings nicht sauber, es heiss ja add ActionListener und nicht setActionListener. So würde jeder neue Listener den vorherigen überschreiben, die Listener sollten also in einer java.util.List o.ä. hinterlegt werden und dann die actionPerformed Methode aller registrierten Listener aufgerufen. Schau mal in den Sourcecode einer entsprechenden Klasse (z.B. javax.swing.AbstractButton), wie es dort implementiert ist.

Gruß
Heavy

Noch vielen Dank für die schnelle Hilfe! n/t

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]