2011-01-06 30 views
5

Primera vez de publicar una pregunta en StackOverflow, así que por favor vaya fácil en mí :)Vista desde controlador en Java patrón MVC

Por lo que entiendo, el uso adecuado del patrón modelo-vista-controlador requiere que desacoplamos la vista y el controlador de modo que la vista no sepa nada sobre el controlador. Tengo un pequeño problema para entender cómo hacer esto usando Java Swing.

Digamos que tengo una vista (alguna clase que extendería JFrame), y esta vista tiene un botón. ¿Es seguro decir que me gustaría registrar el controlador como un ActionListener del botón? ¿O lo hago un oyente de toda la vista en sí mismo?

Y cómo hago para hacer esto sin hacer algo como:

button.addActionListener (myController)

en la vista, porque si tuviera que hacer esto en el código de la vista, no lo haría ahora tiene una dependencia en el controlador?

No publiqué ningún código porque, francamente, no tengo mucho que seguir en este momento.

se agradece cualquier ayuda!

+0

enlace a pregunta relevante sobre stackoverflow: http://stackoverflow.com/questions/3066590/gui-problem-after-rewriting-to-mvc.Mi problema principal con MVC es que hay muchas maneras de hacerlo, y me he dado cuenta de que la vista y el controlador generalmente están estrechamente acoplados, por lo que depende realmente del codificador decidir cómo quiere resolver las dependencias. ¡Gracias por todas sus respuestas! – Alan

Respuesta

4

Puede ser útil no pensar en la vista en términos de botones, etc. sino en una interfaz. La interfaz permite escribir web ui, consolas de línea de comandos, etc. y cumplir el rol de la vista.

En el caso de su evento de botón, el botón representa una llamada a algún comando realizado por el controlador.

Por lo tanto, usted podría tener una interfaz como esta:

public interface MyViewIf { 
    // used by the controller to register its self as a listener of the view 
    public addViewListener(ViewListener vl); 
    ... 
} 

y:

public interface ViewListenerIf { 
    // used by the View to notify any listeners of control events etc. 
    public onViewEvent(ViewEvent ve); 
} 

A continuación, el controlador podría aplicar ViewListenerIf y registrar su auto con una fábrica generada instancia de MyViewIf. De esta forma, el controlador no necesita conocer ningún detalle sobre su (s) clase (s) de visualización. Su clase de vista manejaría internamente sus propios eventos de botón, los convertiría en objetos ViewEvent y llamaría a ViewEvent() en el controlador que se registró con la vista, dejando la vista 100% ajena a la existencia del controlador.

+0

Un comentario más rápido: también puede reemplazar los métodos addViewListener y onViewEvent por una serie de métodos addXXXEventListener más específicos y los objetos de evento correspondientes, etc. A veces no es conveniente tratar de genizar todos los eventos de View en un solo objeto. – Nick

+0

Gracias! Esto definitivamente está en la pista de lo que estaba buscando. ¿Puedes elaborar un poco sobre los objetos de ViewEvent? ¿Es esto algo que tendría que codificar yo mismo, o hay clases relevantes en las bibliotecas de Java Swing que puedo extender ...? He estado leyendo en swing en los tutoriales de Java, así que si me he perdido una explicación en otro lugar, podría simplemente señalarme en la dirección correcta :) – Alan

+0

En cuanto a qué usar para su clase de evento, puede ser Prácticamente cualquier clase, pero creo que es más rápido escribirlas usted mismo, ya que tienden a ser objetos muy simples con campos específicos de la aplicación. Por ejemplo, si su vista solo necesita pasar mensajes y no cadenas, matrices, etc. su objeto ViewEvent podría consistir en un único campo int o enum que represente el messageId. – Nick

1

Eche un vistazo a Spring Framework para obtener una idea de cómo implementar el patrón MVC. Tutorial breve de Spring Tutorial

+0

Gracias por el enlace. Lo miraré. – Alan

1

Crea un actionlistener en tu clase de vista. Desde su oyente de acción llama a su controlador.

Código

para ActionListener:

controller.doButtonClick(); 

Esto significa que necesita para inyectar su modelo y controlador a la vista. Así es como lo hago.

+0

¿Esto no introduce una dependencia del controlador desde la vista? Si es así, ¿esto es aceptable en el patrón MVC? Y si no, ¿cómo es eso, ya que de hecho nos estamos refiriendo al controlador desde la vista, solo indirectamente a través del oyente de acción? – Alan

+1

Sí lo hace. Pero creo que está bien. Usamos el patrón mvc para separar el ui de la lógica del dominio. Si fuera a crear una nueva interfaz de usuario, solo sería el código de vista que tenía que cambiar. –

+1

Lo que podría hacer sin embargo, es de su llamada de controlador: getView(). GetButton(). AddActionListener (myControllerButtonActionListener); si te gusta eso mejor. Esto no introduce una dependencia del controlador desde la vista. –

Cuestiones relacionadas