[JAVA] Programacion MVC

willy_chaos

Hola a todos, estoy haciendo una aplicacion en Java que se conecta a un Webservice, recoge los datos y los muestra en un JFrame de java.

La cosa es que la parte "modelo" ya la tengo hecha y recoge todo bien, lo guarda en un arraylist<ObjetoPropio>

La parte vista y controlador estan a mitad pero me encuentro ahora que "no se" como pasar los datos del modelo a la vista.

1 - He pensado en pasar el arraylist de los objetos directamente a la vista y que ella se encargue de montar la informacion, pero no me gusta la idea porque entonces no estoy separando bien la vista+controlador de la parte de modelo.

2 - He pensado en pasarlo por String y encadenar toda la informacion, pero luego me encontrare que si quiero mostrar de cierta forma la informacion, tengo que tratarla y separarla.

3 - He pensado en crear un JTable (creo que es asi) de los campos necesarios y rellenarlo en el modelo y pasarselo a la vista mediante el controlador.

Los que desarrollais bastantes aplicaciones en Java como lo soleis hacer ?

zoeshadow

Puedes montar un Adapter que reciba un ArrayList<Modelo> y te retorne la información de la manera que le venga bien a la lista, ya sea una Lista de String por cada fila... etc ( sería interesante en este caso sobreescribir el metodo toString() de tu modelo )

En principio debería de ser el Controlador el que le pasase esa información a la vista una vez la haya extraído del Modelo, pero esto no siempre es posible con una arquitectura clásica, ya que muchas veces los eventos se están capturando en las vistas.

Por esto ultimo a veces me cuesta ver la utilidad del concepto de Controlador dentro de aplicaciones de escritorio/Javascript , y suelo intentar seguir más el patrón MVVM, veo más el Controlador como el método que asocias a una URL en una aplicación Web ( normalmente Stateless o manteniendo el estado a través de Cookies )

willy_chaos

Bueno en este caso tal y como lo estamos haciendo en clase , pasa todo por el controlador y estariamos en las mismas ya que seria el modelo el que generaria por ejemplo el JTable y una vez generado, el controlador lo recogeria y lo pasaria a la vista, pero claro , poder como digo puedo decirle a la vista "Ey que te paso un ArrayList<Objeto> y ya te peleas tu a mostrarlo como quieras (como hago en PHP con los Array) pero me parece enguarrar el tema MVC

Elinombrable

#1 Si sigues el modelo MVC, la vista y el modelo no se conocen entre si. No saben lo que hace cada uno y no les interesa. Para eso tienes al amigo Controlador que los conoce a ambos y sabe cómo funcionan.

Pásale el array de objetos al controlador y que el controlador se encargue de pasárselos a tu lista de la forma adecuada.

Por ejemplo:

En la vista pulsas un botón. Este botón, hace que la vista llame a un método (buscar) del controlador. (La vista tiene una instancia del objeto controlador).

El controlador, se encarga ahora de obtener los datos del modelo. El modelo le devuelve al controlador una lista de Objetos, en tu caso, arraylist<ObjetoPropio>.

Ahora el controlador, se encarga de actualizar los datos de la vista. Para ello, la vista tiene que proporcionar los métodos públicos necesarios para esta tarea.

En tu caso tienes dos opciones:

1.- La vista, tiene un método público del estilo "añadirRegistroJTable(MiObjeto miObjeto)" al que tú le pasas un objeto de la clase que tengas y ella se encarga de agregarlo al JTable de la forma que más te guste.

El controlador, cuando tenga los datos del Modelo, los recorrerá y tendrá que ir llamando a ese método de la vista.

2.- La vista tiene una lista interna (ArrayList) con todos los objetos del JTable (un objeto por registro) y lo que proporciona es un método para añadir otro objeto a esa lista y un método que permite actualizar el JTable.

En este caso, el controlador, llamaría primero al método para agregar los objetos a la lista interna de la Vista y finalmente, llamaría al método "actualizar" de la vista para que el JTable tome los cambios.

Ten en cuenta que aunque la vista y el modelo no tengan que conocerse, tú puedes utilizar una clase creada por ti, que simule un registro entero del JTable conteniendo todos los datos necesarios. Esta clase la usarán tanto la vista, para representar un registro de su JTable como el Controlador, que encapsulará los datos de cada registro que le devuelva el modelo en un objeto de esa clase tuya.

Si no lo entiendes, avísame y te pongo un ejemplillo.

Un saludo.

Elinombrable

Tengo un rato así que por si acaso ten pongo ya el ejemplo que luego igual no tengo tiempo.

Tenemos una base de datos de aviones, datos técnicos de cada avión y tiene también los datos de su fabricante así como muchos otros.

Queremos que nuestra vista nos muestre un listado de fabricantes de aviones.

Nosotros vamos a crear la clase Fabricante, que tiene Nombre y Apellidos.


public class Vista{

private ArrayList<Fabricante> listaFabricantes = new ArrayList()<>;
private Controlador controlador;

public void anadirFabricante(Fabricante fabricante){}

public void pintarJTable(){}

....

}


public class Controlador{

private Vista vista;
private Modelo modelo;

public ArrayList<Aviones> obtenerAviones(){ Llamamos al modelo y nos da la lista de aviones ... }

public void ActualizarVista(){

// Obtenemos los aviones del modelo
// Recorremos la lista de aviones obtenida
// Para cada uno, obtenemos el fabricante con su nombre y apellido
// Creamos un objeto del tipo Fabricante con ese nombre y ese apellido

vista.anadirFabricante (nuevoFabricante);
vista.pintarJTable;

}

}


public class Modelo{ .... }

Lecherito

No os comáis mucho la cabeza, esto java ya lo tiene implementado como por ejemplo con el DefaultTableModel, por lo que a la JTable le dices que tiene un TableModel que está declarado en el Controlador y no hace falta quebrarse mucho los cascos.

1 respuesta
Elinombrable

#6 Sí pero imagino que #1 está aprendiendo a programar y están en clase con la teoría básica de los patrones de diseño. Se trata de implementarlo tú mismo para entender cómo funciona y no de utilizar una clase ya creada igual que cuando yo estaba estudiando, me tocaba crear una linked list "a mano" y no me valía con utilizar la que ya existe en java... pensé que era algo evidente..

1 1 respuesta
Lecherito

#7 No sé, el caso es tener la clase que controle a ese Model, pero ponerse a implementar un Model por si mismo es un coñazo enorme xD

1 respuesta
H4z4rD

#1 Los que desarrollais bastantes aplicaciones en Java como lo soleis hacer ?

Se que no te vale de mucho ahora esta respuesta, pero si quizá en un futuro. Los que día a día desarrollamos aplicaciones siguiendo el modelo MVC en Java, no reinventamos la rueda, utilizamos frameworks de desarrollo que ya siguen este patrón. Como por ejemplo Struts.

Elinombrable

#8 El modelo de la tabla no tiene nada que ver con el modelo del que se habla aquí. Aquí tenemos la vista con su JTable (y que tendrá a su vez su tableModel para modificar y presentar la información), por otro lado el modelo DE DATOS (que accederá a una base de datos) y por último el controlador que los conecta a ambos.

El TableModel es independiente a todo esto que estamos hablando. Creo que estás confundiendo el modelo del que se habla en este post con el modelo del JTable.

#8 Hace tiempo que no uso Struts (de hecho programo en Java por afición ya que en mi trabajo no lo suelo utilizar) pero totalmente de acuerdo. Hoy en día sueles utilizar el framework que realiza este tipo de abstracciones por ti. De todas formas, entender este tema de separar unas clases de otras (especialmente vistas y modelos) para que sean totalmente independientes es lo que tratan de enseñarle a #1 en clase. Te ayuda a programar mejor posteriormente. Luego los frameworks simplemente te facilitan la tarea para que como bien dices, no tengas que reinventar la rueda.

willy_chaos

Luego cuando llegue a casa me pongo con ello. Para clase este proyecto (del cual tengo la duda) no es, ya que en clase nos han dicho que hagamos una String y se lo pasemos a la vista como String, pero a mi me parece una guarrada por si luego en la vista lo quiero mostrar de una forma o otra.

Por eso prefiero preguntar a los que ya llevais los huevos pelados de programar en Java con MVC para ver como es mejor solventar este paso.

Una vez termine la app os la pongo aquí y le pegais un vistazo :), a ver si puede ser entre esta semanita.

Gracias a todos!

Usuarios habituales

  • willy_chaos
  • Elinombrable
  • H4z4rD
  • Lecherito
  • zoeshadow