Foros del Web » Programación para mayores de 30 ;) » Java »

Comunicar ventanas (pasar objetos de un JDialog a un JFrame)

Estas en el tema de Comunicar ventanas (pasar objetos de un JDialog a un JFrame) en el foro de Java en Foros del Web. Explicaré un poco sobre las clases que he creado y luego preguntaré. Las clases Origen y Destino tienen sólo 2 atributos, ambas incluyen un String ...
  #1 (permalink)  
Antiguo 06/02/2014, 22:05
 
Fecha de Ingreso: noviembre-2006
Mensajes: 166
Antigüedad: 18 años
Puntos: 6
Comunicar ventanas (pasar objetos de un JDialog a un JFrame)

Explicaré un poco sobre las clases que he creado y luego preguntaré.
Las clases Origen y Destino tienen sólo 2 atributos, ambas incluyen un String nombre y un int (la diferencia es que Origen presenta oferta y Destino presenta un atributo llamado demanda).

Un JFrame principal pregunta cuántos orígenes y destinos existen en el problema (el programa al final debería poder resolver problemas de transporte). Y entonces, debe leer cada origen y cada destino. Pero como presentan 2 datos, no es muy conveniente usar showInputDialog (de JOptionPane) porque podría confundir al usuario al momento de ingresar datos.

Entonces he creado una ventana que sólo se encargue de leer tales datos y los envíe de vuelta al JFrame principal. En un inicio era otro JFrame, pero luego he leído que es conveniente usar JDialog en estos casos, pues así puede hacerse modal y no ocupar espacio en la barra de tareas.

Como esta clase que hereda de JDialog puede leer tanto Origen como Destino, lo he creado como clase genérica, para que reciba un tipo <T>. Pero, al final no sé cómo crear el objeto que debe ser devuelto. Es decir, ¿es posible crear una instancia de T? Porque supuestamente la clase no puede predecir qué clase recibirá como parámetro.

Específicamente me refiero a este método que he escrito, pero que me aparece resaltado con errores:
Código:
    public T getValorCreado() {
        valorCreado = new T(campo1.getText(), Integer.parseInt(campo2.getText()));
    }
Desde el JFrame principal planeo crear la instancia del JDialog y luego usar un método para recibir el objeto que se creó con los datos leídos.

Gracias de antemano y espero por favor que me puedan ayudar.

Última edición por TrucosJuan; 06/02/2014 a las 22:06 Razón: Olvidé agradecer :S
  #2 (permalink)  
Antiguo 07/02/2014, 02:41
Avatar de pablor21  
Fecha de Ingreso: noviembre-2008
Ubicación: Montevideo - Uruguay
Mensajes: 197
Antigüedad: 16 años, 1 mes
Puntos: 13
Respuesta: Comunicar ventanas (pasar objetos de un JDialog a un JFrame)

Hola,

No puedes instanciar T, porque no es un tipo definido, justamente es un genérico, por lo general se crean clases con genéricos para poder ser reutilizadas luego por otras clases, heredando...

Por otro lado, no necesitas el genérico, porque si quieres hacerle un new, con los dos campos y el constructor ya los recibe, entonces no es muy genérico,¿debería ser T cualquier clase que reciba un string y un int en el consturctor? ¿Cómo le indicas esto al compilador?

Creo que deberías sacar el genérico y poner la clase que vas a utilizar.

Saludos,
__________________
Desarrolloador Freelance - http://www.mvdit.com.uy
  #3 (permalink)  
Antiguo 07/02/2014, 08:58
 
Fecha de Ingreso: noviembre-2006
Mensajes: 166
Antigüedad: 18 años
Puntos: 6
Información Respuesta: Comunicar ventanas (pasar objetos de un JDialog a un JFrame)

Las clases Origen y Destino eran idénticas, entonces he creado una llamada Paradero que las reemplace y un atributo tipo para identificar de cuál se trata.

Y ahora la clase principal envía como argumento un objeto Paradero a la clase que se encargará de leer los datos. Entonces, cuando se presione el botón, se usarán métodos SET para asignar los valores correspondientes. En java siempre es un paso por referencia me parece haber leído.

Pero en caso de que yo no haya hecho ese cambio, pensaba usar un método GET de la clase que lee para obtener el objeto creado. En ese caso, desde la clase principal habría escrito algo así:

Código:
DialogLector d = new DialogLector("Título", this, true);
Paradero p = d.getObjetoCreado();
En ese caso, al abrirse la nueva ventana, ¿se detiene la ejecución en el JFrame principal? Porque si va de corrido no permitirá que el usuario ingrese los datos en los JTextField.

Muchas gracias, en serio
  #4 (permalink)  
Antiguo 07/02/2014, 12:42
Avatar de pablor21  
Fecha de Ingreso: noviembre-2008
Ubicación: Montevideo - Uruguay
Mensajes: 197
Antigüedad: 16 años, 1 mes
Puntos: 13
Respuesta: Comunicar ventanas (pasar objetos de un JDialog a un JFrame)

Lo que quieres hacer se soluciona con un listener en el formulario padre, que esté escuchando cuando la ventana de ingreso se cierre, de lo contrario estarías programando secuencialmene, y esa no es la idea en general en java, y tampoco en un entorno gráfico:


Código Java:
Ver original
  1. miVentana.addWindowListener(new WindowAdapter() {
  2.     @Override
  3.     public void windowClosed(WindowEvent e) {
  4.         Paradero p = d.getObjetoCreado();
  5.     }
  6. });
__________________
Desarrolloador Freelance - http://www.mvdit.com.uy
  #5 (permalink)  
Antiguo 07/02/2014, 15:52
 
Fecha de Ingreso: noviembre-2006
Mensajes: 166
Antigüedad: 18 años
Puntos: 6
Respuesta: Comunicar ventanas (pasar objetos de un JDialog a un JFrame)

He usado el evento windowClosing, para así poder hacer una validación de los datos, y de ser correctos cerrar la ventana.
Al inicio no me funcionaba hasta que le configuré DO_NOTHING_ON_CLOSE como operación al cerrar.

Muchas gracias por su ayuda.

Tengo una última duda... me he dado cuenta que cuando asigno eventos a componentes, si lo hago luego de pack(); setVisible(true); no funcionan en absoluto. Sólo si uso addActionListener, addWindowListener u otros antes de usar las instrucciones que mencioné antes funcionan.
¿A qué se debe ello?

Etiquetas: clase, comunicar, jdialog, objetos, programa, string, valor, ventanas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:08.