# ActionListener und Methoden-Aufruf aus anderen Klassen



## Guest (26. Nov 2005)

Hallo,

ich weiss nicht genau, ob ich hier im richtigen Thread bin, aber ich meine schon. Ich habe es gerade begonnen mich mit OO-Programmierung und Java zu beschäfigen. Es geht sich um folgendes:

Ich versuche mittels Swing und ActionListener eine GUI aufzubauen. Dazu habe ich bisher z. Bsp. die folgenden Klassen:

Fenster - enthält die Fensterinformation, den Menüaufbau und auch als interne private final class die ActionListener, die ich menuListener, nenne

testing - in dieser Class stehen meine Methoden, auf die ich gerne per ActionListener zugreifen würde

main - mittels 
	
	
	
	





```
Fenster f = new Fenster(fenstername);
```
 baue ich die GUI auf, f wird mittels 
	
	
	
	





```
f.add(p);
```
 die zu zeichnenden Argumente übergeben

Nun zu meinem Problem. In dem Menü will ich zum Beispiel die Funktion "Datei öffnen" aufrufen, die zugehörige Methode befindet sich in testing. Wie mache ich das, wenn der ActionListener aber in Fenster als interne Class liegt. Das beenden das Programms über einen Menü-Eintrag und entsprechenden ActionListener bekomme ich auch hin. 

Meine interne ActionListener-Class sieht so aus:


```
private final class menueLauscher implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if(e.getActionCommand().equals("Beenden")){
				System.exit(0);
			}
			if(e.getActionCommand().equals("Datei oeffnen")){
				System.out.println("Datei oeffnen");
			}
			if(e.getActionCommand().equals("Datei speichern")){
				System.out.println("Datei speichern");
			}
		}
	}
```

Anstelle der Ausgabe "Datei oeffnen" soll aber die entsprechende Methode aufgerufen werden. Aber da weiss ich nicht weiter.


----------



## André Uhres (26. Nov 2005)

```
class Fenster extends JFrame {
    public Fenster(String name){
        ...
        menueLauscher = new MenueLauscher();
        testing = new Testing();
    }
    public void add(String arg){
        if(arg.equals("menu")){
            ...
            openItem.addActionListener(menueLauscher);
            ...
        }
    }
    private Testing testing;
    private MenueLauscher menueLauscher ;
    private final class MenueLauscher implements ActionListener {
            ...
            if(e.getActionCommand().equals("Datei oeffnen")){
                testing.openFile();
            }
            ...
        }
    }
}
class Testing{
    public void openFile(){
        System.out.println("Datei oeffnen");
    }
}
```


----------



## diff (28. Nov 2005)

Hallo,

ich habe eine recht ähnliches Problem. Und zwar beginnt mein Problem dort, wo die Lösung des vorherigen endet. 


```
public class Fenster extends JFrame {
	private MenueLauscher m1;
	private Painter p;
	
	public Fenster(String kopf) {
	        ...
	        m1 = new MenueLauscher();
		p = new Painter();
	}
	
	public void Add(String arg) {
		if(arg.equals("menu")){
			...
                       JMenuItem itemOeffnen = new JMenuItem("Datei oeffnen");
			itemOeffnen.addActionListener(m1);
	
			...
			menuLeiste.add(menuDatei);	
			setJMenuBar(menuLeiste);
			}		
		}
	
	private final class MenueLauscher implements ActionListener {
		public void actionPerformed(ActionEvent e) {
		       ...
	               if(e.getActionCommand().equals("Datei oeffnen")){
				p.load("Hallo.dat");
				System.out.println("Datei oeffnen");
		       ...	
                       }
			
		}
	}
}
```


```
public class Main {

	public static void main(String[] args) {

		Fenster f = new Fenster("Malereien");
		f.Add("menu");
		Painter p = new Painter();
		f.add(p);
		f.setVisible(true);
	}

}
```



```
public class Painter extends JComponent {
	Collection<Paintable> ps = new ArrayList<Paintable>();
	int zaehler;
	

	public void addp(Paintable p)
	{
		ps.add(p);

	}
	
	public Collection<Paintable> getPaintables() {
		return new ArrayList<Paintable>(ps);
	}

	public void paint(Graphics g){
			super.paint(g);
			Iterator<Paintable> paintableIterator = ps.iterator();
			while(paintableIterator.hasNext()){
				Paintable p = paintableIterator.next();
		    p.draw(g,getWidth(), getHeight() );
		}
	}
	
	public void load(String name){
		try {
			FileInputStream fin =  new FileInputStream(name);		
			load(fin);
			}
		catch(IOException e)
		{
			System.out.println("error beim lesen von "+name);
			e.printStackTrace();
		}	

	}
	public void load(InputStream inpt){
		try {
			ObjectInputStream in = new ObjectInputStream(inpt);
			Collection<Paintable> readObject = (Collection<Paintable>) in.readObject();
			ps = readObject;
			in.close();
			repaint();
			}
		catch(Exception e)
		{
			System.out.println("error beim lesen");
			e.printStackTrace();
		}
	}
	
}
```

Jetzt besteht mein Problem darin, die geladenen Objekte in dem geöffneten Fenster anzuzeigen. Ich habe ja keinen Zugriff in der Class MenueLauscher auf das Fenster, daher kann ich da auch keine neue Objekte zufügen. 

Wenn ich in der Main mittels 

```
p.load("datei.dat");
f.add(p);
```
zugreife, dann werden die Objekte auch korrekt im Fenster angezeigt, aber leider nicht über das Menü.

Die Daten werden zwar aus der Datei geladen, aber wie gesagt nicht angezeigt. Sicherlich weiss hier wer, wie ich mein Problem lösen kann.


----------



## André Uhres (28. Nov 2005)

```
...
    public void Add(String arg) {
        if(arg.equals("menu")){
            //...
        }else if(arg.equals("painter")){
            p = new Painter();
            add(p);
        }
    }
    ...
    public static void main(String[] args) {
        Fenster f = new Fenster("Malereien");
        f.Add("menu");
        f.Add("painter");
        f.setVisible(true);
    }
    ...
```


----------

