Swing SwingActions und das Problem auf den View bzw. das Model zuzugreifen

Jay1980

Bekanntes Mitglied
Servus,

ich will SwingActions einsetzen, damit ich die Aktionen an verschiedenen Stellen im Programm nutzen kann. Der Controller haengt beim View meine Actions ein, soweit so gut. Dazu bindet der Controller den View ans Model, soweit so gut. Nur wenn jetzt ein Event abgedrückt wird, dann kennt die Action ja nur das ActionEvent und nicht mehr den View oder den Controller der dazu gehört. Meine Actions sind alle in etwa so aufgebaut:

Java:
public class AboutAction extends AbstractAction {

	{
		putValue( Action.NAME, "Über ..." );
		putValue( Action.DISPLAYED_MNEMONIC_INDEX_KEY, 0 );
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		GuiController controller = new GuiController();
		controller.doAboutAction();
	}

}

Der Controller macht dann so etwas:
[Java]
public GuiController( )
{
// create and bind objects
model = new JobaCalculator();
WelcomeView view = new WelcomeView( model, this );// bind view to model - Observer-Pattern - JavaInsel8, S. 436ff
model.addObserver(view);

// actions einhaengen
view.getSymbolButton0().addActionListener( new CalcAddDigit0Action() );
view.getSymbolButton1().addActionListener( new CalcAddDigit1Action() );
view.getSymbolButton2().addActionListener( new CalcAddDigit2Action() );
....
view.getSymbolButtonPlus().addActionListener( new CalcProcessCommandPlusAction() );
this.doStartAction( view );
}

public void doStartAction( WelcomeView view ) {

// configure view, default action-objects are set in view itself

// collect data, call model, configure and create
// new view, grab rootframe and replace old view
RootFrame rf = RootFrame.getInstance();
rf.replaceView(view);
}
[/code]

Wie macht ihr das, also der SwingAction etwas mitgeben? Wenn ich das kann, dann kann ich meine Notlösung vorantreiben, dass mein View nicht nur das Model sondern auch seinen Controller speichert, ich will also nicht mit jeder Action eine GuiController-Instanz erzeugen, sondern so oft es geht den Controller aus dem View holen. Vielleicht mach ich den GuiController als Singleton, mal schauen. Meine Idee war: ist der GuiController die Anlaufstelle für alle Methoden aus den SwingActions, dann kann ich sehr einfach einen Packen Unittests auf diese Klasse loslassen, daher wollte ich die Logik in dieser Klasse sammeln.

Bei einem anderen Tutorial wurde das so gelöst, dass der Controller viele innere Klassen hat, irgendwie auch nicht schön.

Danke vorab für die ein oder andere Idee.
 
Ok, wenn ich das richtig sehe, kann ich problemlos den View und den Controller via Konstruktor in die SwingAction legen, ich dachte da gibts mit den Exemplarinitialisierer Schwierigkeiten. Ich versuche das nun also so:
Java:
public class GuiController {
	
	JobaCalculator model;
	WelcomeView view; 
	
	public GuiController( )
	{
		// create and bind objects
		model = new JobaCalculator();
		WelcomeView view = new WelcomeView( model, this );// bind view to model - Observer-Pattern - JavaInsel8, S. 436ff
		model.addObserver(view);
		
		// actions einhaengen
		view.getSymbolButton0().addActionListener( new CalcAddDigit0Action(model, view) );
		view.getSymbolButton1().addActionListener( new CalcAddDigit1Action(model, view) );
		view.getSymbolButton2().addActionListener( new CalcAddDigit2Action(model, view) );
               ......
 
Schau mal ob die
new CalcAddDigit0Action()
usw nicht zu
new CalcAddDigitAction("0")
werden könnten.

Ansonsten: Wenn die Actions nicht-statische innere Klassen sind, können sie auf die Instanzvariablen der einschließenden Klasse zugreifen. Hilft das vielleicht? Ansonsten würde wohl kaum etwas daran vorbeiführen, ihnen im Konstruktor das "Ding" mitzugeben, auf dem sie Methoden aufrufen sollen. (Aber keine Singletons ... )
 

Zurück
Oben