Ereignisse erzeugen

Hallo, ihr Computöre,

Wie ist es möglich, Ereignisse - anstatt per Maus- oder Buttonclick - einfach im Programm selbst zu erzeugen ?

Hintergrund : Für eine graphische Animation*) stelle ich mir vor, per Math.random() und currentTimeMillis() in unregelmäßigen Zeitabständen über einen ActionListener neue graphische Objekte (Männchen) zu erzeugen.

Aber : Wie teile ich das Signal dem ActionListener mit ? Ist das irgendwas mit dispatchEvent ? Welches Objekt teilt welchem etwas mitt (this ? ActionListener ?)? Zumindest ist es mir noch nicht gelungen.

Ich würde mich freuen, wenn mir jemand einen Tipp geben könnte.

mfg
Klaus

*) Beispiele gibt es auf meiner HP http://www.kanitrino.de zu sehen.

Hallo Klaus.

Wie ist es möglich, Ereignisse - anstatt per Maus- oder
Buttonclick - einfach im Programm selbst zu erzeugen ?

Buttons stellen (a) eine doClick()-Methode bereit, die
programmatische Klicks erlauben.

Verallgemeinert werden bei grafischen Java-Komponenten
ActionListener registriert, die auf ein Ereignis, wie
z.B. den Button-Klick reagieren. Du kannst Dir also
die (b) registrierten ActionListener einer Komponente
zurückgeben lassen und deren actionPerformed()-Methode
manuell aufrufen.

Dies ist aber für das was Du vorhast schlechter Stil, denn
eigentlich sind die ActionListener ja nur eine indirekte
Form, eine bestimmte Zielfunktion eines Objekts aufzurufen
(z.B. erstelleNeueFigur()).

Wenn Du also programmatisch im Hintergrund neue Figuren
erstellen möchtest, solltest Du © die Zielfunktion in
einem Thread ohne die Umwege über einen ActionListener
aufrufen.

Weils so schön ist, die Hackvarianten (a) und (b) zur Illustration
in einen (stilistisch schlechten) Beispielcode gegossen:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ButtonTest {
 public ButtonTest() {}

 public void doSomething() {
 System.out.println("Doing important stuff ...");
 }

 public static final void main(String[] args) {
 JFrame frame = new JFrame("ButtonTest");
 final ButtonTest test = new ButtonTest();
 JButton okButton = new JButton("OK");
 okButton.addActionListener(new ActionListener() {
 public void actionPerformed(ActionEvent e) {
 test.doSomething();
 }
 }
 );
 frame.getContentPane().add(okButton);
 frame.setSize(new Dimension(400,300));
 frame.setVisible(true);

 try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); }
 System.out.println("(a) Clicking button automagically ...");
 okButton.doClick();

 try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); }
 System.out.println("(b) Trigger all action listeners automagically ...");
 ActionListener[] arrListeners = okButton.getActionListeners();
 for (int i=0; i

Links zum Thema:
http://java.sun.com/docs/books/tutorial/uiswing/learn/example2.html#handlingEvents

sowie Arbeit mit Threads unter
http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html

Gruß,
-Andreas