2010-09-13 10 views
9

Soy nuevo en swing, pero logré crear una guía descendente.
Mi problema es que no pude aplicar los patrones sugeridos en las referencias/tutoriales, principalmente el patrón MVC.java swing vs mvc: ¿este patrón es realmente posible?

¿Soy yo, o en JTree y el uso de SwingWorker, no es posible tener una clara separación de controlador/vista/modelo?
Por ejemplo, uso un Swingworker, pero luego no puedo "ajustar" un controlador en el diseño.

I.e. la acción del control esencialmente está en el método doBackground que está dentro, por ejemplo, la acción de un botón.
Entonces no hay clase de controlador.

El resultado de la acción en swing worker es actualizar un Jtree, por lo que paso el resultado a un modelo de clase I, pero esta clase tiene que tener acceso al treeModel del Jtree que está dentro del JFrame, es decir, ver, por lo que no hay una clara separación de vista y modelo.

Miré a una gran cantidad de tutoriales pero todos presentando el MVC tenido un ejemplo trivial, y en la mayoría de los casos la vista (que era sólo un algunas etiquetas!) Actualizado todo. ¿Estoy completamente confundido, o no es posible o al menos es fácil integrar un patrón MVC en una aplicación de swing que usa swingworkers y jtrees?

Estoy hablando de los datos en el dominio real y no la MVC que se implementa en los componentes Swing.

¿Alguien puede ayudarme (y librarme de este terrible dolor de cabeza) ya sea con una visión general de cómo se puede abordar este diseño o al menos con un tutorial, que es útil, con un ejemplo no trivial?

Gracias

Respuesta

6

Cuando tengo a construir aplicaciones más grandes (persona-años de desarrollo), a menudo abstracta de la arquitectura MVC encima de los componentes individuales a un controlador/modelo de nivel superior y vista, y acepta que los componentes individuales serán su propio MVC personalizado. GeoffreyZheng tiene toda la razón en su evaluación, y es algo que realmente me ha encantado desarrollar con el entorno Swing. Dicho esto, si quiere MVC verdadero, probablemente necesite abstraerse de los componentes individuales y hablar de una vista en una terminología más abstracta.

+0

Entiendo lo que dices. Pero si creo un controlador, modelo, en el caso de JTree, tendría que mantener información sobre dónde se debe colocar un resultado producido por una acción en el árbol. El controlador puede pasar el resultado de una acción a mi modelo personalizado y el modelo puede disparar un evento a la vista de que hay una actualización disponible. Pero, ¿cómo puede el árbol saber dónde colocar el nuevo nodo (o actualizar el existente)? No quiero volver a pintar todo el JTree. Solo la parte que tiene que cambiar. Pero esto significa que el modelo debe conocer la estructura JTree. Entonces esta no es una separación limpia. ¿Derecha? – Cratylus

+1

Cuando estoy usando un JTree para representar algo, normalmente estoy almacenando la información en el back-end como un árbol también. Esto significa que puedo transmitir algunos datos: la ubicación, la profundidad, etc. O bien, puedo usar TreeModel en el back-end como parte del modelo y hacer que active los eventos. Siempre que la vista no modifique directamente el modelo, no veo un gran problema allí. Espero que eso ayude a aclarar. – aperkins

+0

@perkins: Perdón por haberte perdido en la última parte. Usted almacena en el modelo, por ej. DefaultMutableTreeModel del JTree, y actualizarlo usando sus métodos (add, insertNodeInto, etc.) del modelo? En la primera parte, ¿qué estructura utilizas para almacenar información en el back-end como un árbol? – Cratylus

5

swing no stricly MVC, ya que la compañía anteriormente conocida como Sun openly admits it:

(Una separación tradicional MVC) no trabajo bien en términos prácticos, porque la vista y de piezas del controlador de un componente requieren un estrecho acoplamiento (por ejemplo, era muy difícil escribir un controlador genérico que no sabe específicamente acerca de la vista). Entonces, colapsamos estas dos entidades en un objeto de interfaz de usuario única (interfaz de usuario).

Para JTree tienes TreeModel como, adivina, modelo. Algunos componentes simples como JLabel ni siquiera tienen un modelo.

Como el enlace explica, además, lo hace llegar cierto nivel de separación con las clases de interfaz de usuario suministrados por LAF. Sin embargo, los componentes Swing tienen que mantener y controlar muchas propiedades relacionadas con la interfaz de usuario.

1

No estoy seguro si esto ayudará, pero trate de Swing Application Framework (SAF) (JSR 296). Por lo que leo o trato de esto, ayuda a separar la vista del manejo de eventos. Pero no estoy tan en detalle con ejemplos más complejos (como con JTree)

http://java.sun.com/developer/technicalArticles/javase/swingappfr/

Buena suerte!

+3

No, no creo que SAF ayude con este tema en particular; no te obliga a ningún patrón de GUI como MVC, MVP ... En algunos casos incluso fomenta la programación de spaghetti ... Además, SAF ha estado muerto durante un par de años ... – jfpoilpret

4

Todavía en muchos casos es preferible y posible: por supuesto, el controlador necesita conocer el componente, que es el responsable de la acción, pero aún así la vista no necesita ninguna implementación de acción específica. Simplemente no implementa la acción en una clase de vista, sino que usa un controlador (que conoce la vista y el modelo). Así que agregue el oyente de acción allí, actualizando algunos detalles del modelo, por ejemplo, incluso dentro de un SwingWorker.

En casi todos los ejemplos que vi hasta que sé que fue implementado y así, no veo donde esto es diferente con cualquier otro componente, como un jtree.

Tal vez con echar un vistazo a las diferencias entre MVC y MVP (que yo prefiero) es más fácil de entender: MVC or MVP

+0

+1 para referencia de MVP , que siempre olvido mencionar :) – aperkins