# ActionEvents selbst erzeugen



## guni (30. Mrz 2010)

Hallo,

wahrscheinlich ist meine Frage eher eine Anängerfrage; hab aber unter google nichts passendes gefunden.
Also:
ich hab eine Klasse GUI extends JFrame implements ActionListener.
in meinem Fenster existiert ein Button, der eine Methode aus einer anderen Klasse startet.
Nun möchte ich, wenn diese andere Klasse fertig ist eine "Fertig"-Messagebox ausgeben.
Wie sag ich meiner JFrame-Klasse aus der "fremden" Methode raus dass ich fertig bin.
Wollte schon ein ActionEvent erstellen:
in der "fremden" Klasse steht dann also:

```
ActionEvent e = new ActionEvent(this, 0, "FINISHED");
```
in meinem ActionListener steht dann

```
else if (cmd.equals("FINISHED")) { // kommt aus der Main-Klasse
				System.out.println("Hallo");
			}
```
... aber irgendwie geht passiert da nichts :-(
wisst ihr wie ich das umschreiben muss?!

mfg, guni


----------



## Foermchen82 (30. Mrz 2010)

Wenn du in der ActionPerformed-Methode eine zweite aufrufst, bleibst du so lange in der Action Perfomed-Methode hängen bis die gerufenen Methode fertig ist. Es sei denn du startest den aufruf in einem Thread. Was tust du also?


----------



## guni (30. Mrz 2010)

Hallo Foermchen82,

meine Klassen sehen (vereinfacht) so aus:

Main.java:

```
public class Main 
{
	public static void main(String[] args)
	{
		javax.swing.SwingUtilities.invokeLater(
			new Runnable() {
	            public void run() {
	                new GUIConf();
	            }
	        });
	}

	public Main() throws Exception
	{
		// hier werden ein paar Threads gestartet

		// nachdem das Programm durchgelaufen ist:
		ActionEvent e = new ActionEvent(this, 0, "FINISHED");
	}
}
```

GUIConf.java:

```
public class GUIConf extends JFrame implements ActionListener
{
	public GUIConf()
	{
		super();
		initialize();
	}
	
	private void initialize()
	{
		this.setTitle("TITEL");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(500, 480);
		this.setContentPane(getJContentPane());
		this.pack();
		this.setVisible(true);
		run = Runtime.getRuntime();
	}
	
	private JPanel getJContentPane() 
	{
		// hier wird die Content Pane zusammengesetzt
		return jContentPane;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) 
	{
		try {
			String cmd = e.getActionCommand();
			if (cmd.equals ... {
				// hier werden die Commands abgefragt
			} else if (cmd.equals("FINISHED")) { // kommt aus der Main-Klasse
				System.out.println("Hallo");
			}
		} catch (IOException err) {
			err.printStackTrace();
		}
	}
}
```

so ... jetzt will ich irgendwie von der Main-Methode wieder in die ActionPerformed zurück :-(

lg, guni


----------



## Foermchen82 (30. Mrz 2010)

wieso implemetiert dein frame das ActionListenerInterface? ich denke die Action wird vom JButton ausgelöst?. Ansonsten ist es so wie ich es oben beschrieben habe.


----------



## KrokoDiehl (30. Mrz 2010)

Ah, ich glaube hier liegt ein größerer Verständnisfehler vor. Es genügt nicht, irgendwo ein 
	
	
	
	





```
new ActionEvent()
```
 zu machen, um ein Ereignis auszulösen. Überlicherweise werden _ActionListener _an Buttons gehängt, was dann etwa so aussieht:

```
// GUI
JButton myButton = new JButton("Klick mich");
myButton.addActionListener(this); // oder anderes Objekt, das von ActionListener erbt

// im ActionListener:
public void actionPerformed(ActionEvent event)
{
    // ggfs prüfen woher das Event kommt mit event.getSource() oder event.getActionCommand()
    // mache entsprechend etwas
}
```

Das Auslösen des _ActionEvents _passiert irgendwo im _JButton_-Code. Dort werden alle _ActionListener_, die an 
	
	
	
	





```
myButton
```
gehängt wurde, über den Klick benachrichtigt. Überlicherweise heißen solche Methoden 
	
	
	
	





```
fireBLABLA()
```
, wobei "BLABLA" für das jeweilige Ereignis steht (z.B. 
	
	
	
	





```
fireActionPerformed()
```
).

In deinem Fall ist mir nicht klar, was du genau erreichen willst. Du hast einen Button, wenn du den klickst, wird etwas gemacht, und wenn das fertig ist, soll eine Meldung kommen?


----------



## Michael... (30. Mrz 2010)

Für solche Anforderugen gibt's ein Entwurfsmuster:http://www.java-forum.org/allgemeines/91829-mvc.html


----------



## guni (31. Mrz 2010)

> In deinem Fall ist mir nicht klar, was du genau erreichen willst. Du hast einen Button, wenn du den klickst, wird etwas gemacht, und wenn das fertig ist, soll eine Meldung kommen?



genau! aber woher weiß ich wenn ich fertig bin?!
in meiner Main() werden mehrere Threads gestartet.
Und wie kann meine Main bekannt geben, dass sie fertig ist?!

mfg, guni


----------



## Michael... (31. Mrz 2010)

Wenn's nur darum geht ein Meldungsfenster anzuzeigen dann kann das ja auch die Klasse tun, die irgendwelche Prozesse fertig abgearbeitet hat.
Ansonsten könntest Du Dir in der Klasse Main eine Referenz auf die erzeugte GUI-Klasse in einer Variablen speichern und die GUI Klasse über diese Referenz ansprechen.


----------

