Wie es anstellen das ActionPerformed einen Wert zurückgibt?

Rufus.Mueller

Bekanntes Mitglied
Liebe Freunde,

bekanntermaßen hat die Methode ActionPerformed ja keinen Rückgabewert. Das ist schlecht, weil ich genau so etwas bräuchte.

Hintergrund: Bei meinem Programm muss der Anwender einige Eingaben tätigen. Diese Eingaben werden in einem Array abgespeichert. Wenn der Anwender fertig ist, soll er einen Button "Fertig" auswählen. Der ActionListener dieses Buttons soll dann besagtes array zurückgeben.

Gibt es einen Trick um das doch noch so zu bewerkstelligen?

Andernfalls würd' ichs über Umwege machen, bis jetzt ist meine Idee: Den ActionListener this.eineNochzuImplementierendeMethode aufrufen lassen und diese Methode ruft dann eine Methode auf der anderen Klasse auf (die, die das Objekt mit den ActionListenern ursprünglich aufgerufen hat) und übergibt das array halt als Parameter.
 
Ja, du baust dir dein eigenes Event auf und dazu einen entsprechenden eventListener.

ActionPerformed schmeißt dann ein Event, dass Action und das entsprechende Arrayenthält.
 
Wie genau ist dein Aufbau? Die Meisten implementieren Listener nur anonym, das könnte so aussehen:

Java:
public class IrgendeinFrame extends JFrame
{
	private String[] result;
	private List<IrgendeinFrameListener> listeners;

	public IrgendeinFrame()
	{
		super();
		listeners = new LinkedList<IrgendeinFrameListener>();
		result = new String[1];

		JButton button = new JButton();
		button.addActionListener(new ActionListener() {
			public void actionPerformed()
			{
				berechneIrgenwas();
			}
		});
		add(button);

		JButton finishButton = new JButton();
		finishButton.addActionListener(new ActionListener() {
			public void actionPerformed()
			{
				fireIrgendwasEvent();
				dispose();
			}
		});
		add(finishButton);
	}
	private void berechneIrgendwas()
	{
		result[0] = "41";
	}
	protected void fireIrgendwasEvent()
	{
		if(listeners.size() == 0)
			return;

		SwingUtilities.invokeLater(new Runnable() {
			public void run()
			{
				for(Listener l:listeners)
					l.irgendwasPassiert(result);
			}
		});
	}
	public void addListener(IrgendeinFrameListener l)
	{
		listeners.add(l);
	}
	
	public interface IrgendeinFrameListener
	{
		public void irgendwasPassiert(String[] result);
	}
}

etc., usw. Vom Hirn in die Tasten. Übrigens soll man laut FindBugs eher keine Arrays per Methode übergeben, das war nur ein Beispiel. Aber vergessen warum.
 
Zuletzt bearbeitet:
keine Arrays per Methode übergeben, das war nur ein Beispiel. Aber vergessen warum.

Weil du keine Ahnung hast, was die Methode mit dem Array anstellt 😉

Die meisten Listener sind gewiss nicht Anonym... Bzw ist das eine Behauptung, die man so nicht lange halten kann.

Ich würde mir das genau überlegen, wie man das macht.
 
Ja, du baust dir dein eigenes Event auf und dazu einen entsprechenden eventListener.

ActionPerformed schmeißt dann ein Event, dass Action und das entsprechende Arrayenthält.

Ich versuche nach diesem Tutorium vorzugehen: http://www.java-forum.org/allgemeines/3212-listeners-events.html

Bisher habe ich ein Interface implementiert, wobei MeinEvent noch rot unterringelt ist.

Java:
public interface ListenerMitReturn {

	 public abstract Sequenz changeHappened(MeinEvent);
	 
}


Aus dem Tutorium ist nicht ersichtlich wo "ChangeEvent" implementiert wird, ist das eine eigenen Klasse? In der Signatur taucht der Begriff Klasse zumindest nicht auf.


@Volvagia

Soweit ich es verstehe, implementiere ich ihn anonym (ich kenne eigentlich auch nur diese Art der Implementierung für Listener):

Java:
fertigButton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg) {

			
				
			};
		});
 
Ach so, weil sich dann Schreibzugriffe auf beide Klassen auswirken?

Du hast recht, es war falsch geschrieben. Dabei handelt es sich eigendlich nur um meine Beobachtungen, hauptsächlich hier im Forum. Ich habe es eher als Tatsache geschrieben.

Es gibt ja folgende 3 Möglichkeiten, einen Listener zu implementieren:

Die Hauptklasse implementiert den Listener, per Event-Source wird dann in der implementierten Methode geprüft welches Element den Listener abgefreuert hat. Dadurch wird aber die Methode auf Dauer sehr groß und meiner Meinung nach nicht so ordentlich wie seperate Listener.
Die Klasse wird anonym implementiert und ruft dann einfach ein paar wenige Methoden auf, wie in meinen Beispiel. Dadurch hat man aber natürlich keinen Schreibzugriff auf Methodenvariablen.
Es gibt eine eigene Klasse für die Listener. Dadurch muss diese Klasse aber auch sämtliche Ressourcen, die womöglich in der Hauptklasse verändert werden kennen was zu erhöhten Abhängigkeiten führt.

Ich denke das waren alle. Wenn ich irgendwo einen Denkfehler gemacht habe oder eine Möglichkeit vergessen, sagt es mir bitte. Aber ich denke, die 2. Möglichkeit ist wegen den Vor/Nachteilen die bevorzugte, oder?


@Rufus: Schau in mein Beispiel, da habe ich auch gleich einen eigenen Listener mit eingebaut. MeinEvent muss als Klasse natürlich existieren, und du musst aus irgend einen Grund einen Namen nach der Klasse eintippen.
 
Zuletzt bearbeitet:
Ich habe jetzt diesen Listener und dieses Event implementiert.

Java:
import java.awt.event.ActionEvent;


public class MeinEvent extends ActionEvent {

	public MeinEvent(Object source, int id, String command) {
		super(source, id, command);
		// TODO Auto-generated constructor stub
	}

}


Java:
import java.awt.event.ActionListener;



public interface ListenerMitReturn extends ActionListener {

	 public abstract Sequenz actionPerformedMitReturn(MeinEvent e);
	 
	 
	 
}


Und in der Hauptklasse steht das

Java:
fertigButton.addActionListener(new ListenerMitReturn() {



			@Override
			public Sequenz actionPerformedMitReturn(MeinEvent e) {
				// TODO Auto-generated method stub
				
				System.out.println("test");
				return eingabeSequenzVP;
				
				
				
			}

			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(1);

				
			}



		});

Drücke ich auf meinen Button, endet Das Programm. Kommentiere ich Syste.exit(1) aus passiert bei Buttondruck nichts.
 
Ich glaube, du hast das falsch verstanden. Nicht den Button einen neuen Listener geben. Der kennt die Methode actionPerformedMitReturn ja garnicht und kann sie deshalb nicht aufrufen.
Registriere vom Aufrufer her den neuen Listener bei dem Fenster. Wenn "Fertig" gedrückt wird, feuere im ActionPerformed den Listener vom Fenster aus zum Aufrufer, damit er weiß das dort etwas los ist.
 
Ich erstelle meine Listener NIE anonym. Gerade für MVC ist das einfach schlechter Stil.
Ich hab immer meinen Satz an abstrakten Listenern die ich verwende und konkretisiere.

Kommen wir zurück zu MVC:
Was ist denn das genau für ein Array? Business Objekt?
Dann kapsel es in ein Observable und regel das in View über update.
Wenn es zu reinen Darstellungszwecken dient dann bau eine eigene Controller-Klasse mir Referenz auf die View und stell dementsprechende Methoden bereit. Lass das Geraffel mit Rückgabewert bloss sein 😉
 

Neue Themen


Zurück
Oben