Re: Question on MVC model
"Suma Shanbhog" <suma.l@bosch.com> writes:
That is, if any new control has to be added, I have to add a
model, a view class and a controller class...
You need a view, controller and model /object/.
- Multiple objects might share a class when appropriate.
- Multiple views and controllers might share a model
when appropriate.
Inspite of this is there scope for any design pattern to be used for
communication between these classes??
The communication is also treated in MVC.
I always felt that just following MVC should eb sufficient...
Nowadays there are multiple different architectures labeled
"MVC", differing more or less from the original MVC.
Moreover, Swing uses a variant that might be called
"UI-delegate and model".
The most pragmatic approach might be to forget MVC for
the moment and learn Swing by Sun's Swing tutorial.
I know this may not be the right forum for this kind of
question but I didn't locate any group discussing design.
See also: comp.lang.java.gui
If one really tries to use the original MVC
http://st-www.cs.uiuc.edu/users/smarch/st-docs/mvc.html
in Java, it might look like this attempt of mine to
implement a simple toggle-button:
public class ButtonModel
{ public static void main( final java.lang.String[] args )
{ javax.swing.SwingUtilities.invokeLater( new FrameController() ); }}
class FrameView
{ FrameController controller = null;
Button1View button = null;
javax.swing.JFrame frame = null; /* MVC "subView" */
public FrameView()
{ frame = new javax.swing.JFrame( "MVC" );
frame.setDefaultCloseOperation
( javax.swing.JFrame.DO_NOTHING_ON_CLOSE );
final Button1Model model = new Button1Model();
final Button1Controller controller = new Button1Controller();
controller.setModel( model );
button = new Button1View( frame, model, controller );
frame.pack(); frame.setVisible( true ); }
public void setController // MVC "model:controller:"
( final FrameController controller )
{ this.controller = controller;
this.controller.setView( this );
frame.addWindowListener( this.controller ); }
public void releaseController() /* MVC "release" */
{ frame.removeWindowListener( this.controller );
this.controller.releaseView();
this.controller = null; }
public void dispose() /* MVC "release" */
{ this.button.dispose(); this.button = null;
this.frame.dispose(); this.frame = null; }}
class FrameController // MVC "Top-Level Controller
implements java.lang.Runnable, // MVC "StandardSystemController"
java.awt.event.WindowListener
{ FrameView view = null;
public void setView( final FrameView view ) /* MVC "view" */
{ this.view = view; }
public void releaseView()
{ this.view = null; }
public void run() // MVC "open" (cto)
{ FrameView view = new FrameView();
view.setController( this ); }
public void windowClosing /* MVC "terminate" */
( final java.awt.event.WindowEvent e )
{ FrameView view = this.view;
view.releaseController();
view.dispose(); }
public void windowOpened( final java.awt.event.WindowEvent e ){}
public void windowDeactivated( final java.awt.event.WindowEvent e ){}
public void windowDeiconified( final java.awt.event.WindowEvent e ){}
public void windowIconified( final java.awt.event.WindowEvent e ){}
public void windowActivated( final java.awt.event.WindowEvent e ){}
public void windowClosed( final java.awt.event.WindowEvent e){} }
class Button1View /* MVC "view" */
implements java.beans.PropertyChangeListener
{ javax.swing.JButton button = null;
javax.swing.JFrame frame = null;
Button1Model button1Model = null;
private java.lang.String labelText( final boolean state )
{ return state ? "ausschalten" : "einschalten"; }
public Button1View /* MVC "model:controller" (va3) */
( final javax.swing.JFrame frame,
final Button1Model button1Model,
final java.awt.event.ActionListener controller )
{ assert javax.swing.SwingUtilities.isEventDispatchThread();
this.button1Model = button1Model;
this.button = new javax.swing.JButton( labelText( this.button1Model.isOn() ));
this.button.addActionListener( controller );
this.button1Model.addButton1Listener( this );
this.frame = frame;
this.frame.add( this.button ); }
public void propertyChange
( java.beans.PropertyChangeEvent propertyChangeEvent )
{ java.lang.System.out.println( "changed" );
this.button.setText( labelText( this.button1Model.isOn() )); }
public void dispose()
{ this.button1Model.removeButton1Listener( this );
this.frame.remove( this.button );
this.button = null; }}
class Button1Controller
implements java.awt.event.ActionListener
{ Button1Model button1Model = null;
public void setModel( final Button1Model button1Model )
{ this.button1Model = button1Model; }
public void actionPerformed /* MVC event (cpe) */
( final java.awt.event.ActionEvent actionEvent )
{ button1Model.toggle(); }}
class Button1Model
{ private boolean state = false;
javax.swing.event.SwingPropertyChangeSupport listeners;
public Button1Model()
{ listeners =
new javax.swing.event.SwingPropertyChangeSupport( this ); }
public boolean isOn(){ return state; }
public void toggle(){ state = !state; changedState(); }
private void changedState()
{ this.listeners.firePropertyChange
( new java.beans.PropertyChangeEvent
( this, "on", state, !state )); }
public void addButton1Listener
( final java.beans.PropertyChangeListener l )
{ this.listeners.addPropertyChangeListener( l ); }
public void removeButton1Listener
( final java.beans.PropertyChangeListener l )
{ this.listeners.removePropertyChangeListener( l ); }}