Sobre lectura de varios datos a la vez

Iniciado por zonahurbana, 7 Febrero 2014, 00:27 AM

0 Miembros y 1 Visitante están viendo este tema.

zonahurbana

El método showInputDialog de JOptionPane permite leer un único dato. Si son varios usualmente uso un bucle, pero quiero leer datos de a pares porque están relacionados. Y si se lee por separado, podría confundir al usuario.
Estaba creando una clase que herede JFrame y pregunte todas las preguntas que yo le indique, es decir, presente varios JLabel y JTextField según la cantidad de preguntas.
El punto es que, no sé cómo hacer para que devuelva los datos leídos luego de presionar un botón que incluí en el mismo JFrame hacia otro programa que también se está ejecutando y se encargó de crearlo :S
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

egyware

Si usas un JTextField puedes obtener los datos utilizando la función getText, como por ejemplo

String valor1 = jTextField1.getText();

Si usas algún ide, te recomiendo que renombres las variables para que tengas una idea clara de lo que haces.

Saludos!

zonahurbana

#2
Sí, sé cómo tomar los datos de los JTextField, pero no sé cómo enviar esos datos al JFrame principal.
Tengo una clase principal que extiende de JFrame, y desde ésta quiero leer datos usando otra ventana. Por lo tanto, muestro esa ventana y un botón, pero el botón no es capaz de devolver esos datos, ya que el evento es del tipo void.
No sé cómo hacer que se comuniquen las ventanas...
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

ThinkByYourself

Puedes crear una clase que se ocupe de abrir una ventana y que con algún método que se ejecute cuando se le dé click a algún botón de la ventana, lo que te retorne sea un objeto de alguna otra clase que contenga la información que necesites. Esa información se la pasas al objeto que llamó a esa segunda ventana (que imagino era otra ventana), a la par que cierras esa segunda ventana, y ya tendrás la información facilitada por la segunda ventana en la primera ventana u objeto. Es sencillo, pero tienes que tener claro los conceptos de la POO.
No te voy a engañar.
Todos hemos sido programados para normalizar la psicopatía de las élites económicas y políticas, y para realimentar su patrón de ciega codicia.

zonahurbana

Por fin pude hacerlo. Gracias de todos modos.

Y tengo una pregunta adicional:
Quisiera que salte una advertencia cuando el usuario trata de cerrar la ventana secundaria (la que es de lectura) si es que no ha rellenado los campos.

¿Cómo puedo hacerlo?
Porque si uso windowClosing me parece que ejecutará código pero al final se cerrará.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

trolleoatodos

La chapuza qu se me ocurre , es (si se puede) poner la frame en undecorated,
luego hacer un "servicio" (Thread) que verifique cada segundo si los campos
son diferentes d null ,y si es así ¡pam! poner a la ventana normal, si no se puede ,ya
tienes algo con lo que experimentar

1mpuls0

#6
Cita de: zonahurbana en  7 Febrero 2014, 16:28 PM
Por fin pude hacerlo. Gracias de todos modos.

Y tengo una pregunta adicional:
Quisiera que salte una advertencia cuando el usuario trata de cerrar la ventana secundaria (la que es de lectura) si es que no ha rellenado los campos.

¿Cómo puedo hacerlo?
Porque si uso windowClosing me parece que ejecutará código pero al final se cerrará.

Código (java) [Seleccionar]

package ehn;

/**
* @author 1mpuls0
*/

public class Example extends javax.swing.JFrame {

   private javax.swing.JTextField jTextField1;

   public static void main(String args[]) {
       new Example().setVisible(true);
   }

   public Example() {
       initComponents();
   }

   private void initComponents() {

       jTextField1 = new javax.swing.JTextField();
       /*IMPORTANTE*/
       setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);

       /*IMPORTANTE*/
       addWindowListener(new java.awt.event.WindowAdapter() {
           public void windowClosing(java.awt.event.WindowEvent evt) {
               formWindowClosing(evt);
           }
       });


       getContentPane().setLayout(new java.awt.FlowLayout());

       jTextField1.setPreferredSize(new java.awt.Dimension(100, 20));
       getContentPane().add(jTextField1);

       pack();
   }

private void formWindowClosing(java.awt.event.WindowEvent evt) {
   String var = jTextField1.getText().toString().trim();
   if(var.equals("")) {
       javax.swing.JOptionPane.showMessageDialog(null, "Existen campos vacios");
   }else {
       this.setVisible(false);
   }
   
}
   
}
abc

zonahurbana

Muchas gracias por responder.

Antes estaba haciendo que la clase lectora implemente WindowListener, y tenía que sobreescribir todos los métodos abstractos. Si sólo sobreescribía windowClosing me daba error.
Veo que usted usa WindowAdapter, que es en sí una clase y no una interface, por lo que es posible sobreescribir sólo el evento deseado.

He probado a usar windowClosing sin poner el DO_NOTHING_ON_CLOSE y el JDialog muestra el mensaje pero al instante se cierra. Pero ahora, configurándolo, funciona perfectamente.

Gracias nuevamente.

PD: En un inicio no me funcionaba nada de nada, es decir, el evento windowClosing jamás se ejecutaba. Y la razón era que el addWindowListener estaba luego de hacer pack(); setVisible(true);
Lo mismo me pasó antes con el addActionListener de un botón. Es muy extraño.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

ThinkByYourself

Buen código! No supe ver la verdadera dificultad de la pregunta, y hoy me preguntaba cómo se haría realmente. Con el código de Darhius queda mucho más claro qué se puede hacer para conseguirlo! Gracias foreros!
No te voy a engañar.
Todos hemos sido programados para normalizar la psicopatía de las élites económicas y políticas, y para realimentar su patrón de ciega codicia.

ThinkByYourself

Aunque no me queda claro. Pensaba que lo que quería conseguirse era un método estático externo que te permitiera llamar a la creación de la ventana/diálogo, y que cuando se clicara el botón "Aceptar" que el método terminara y pudiera cogerse algún valor concreto que se extrae del formulario. Pensaré cómo hacerlo bien y postearé lo que consiga para adaptarlo a un cómodo:

Código (java) [Seleccionar]

String camposFormulario [] = MiDialogo.mostrar();
String nombre = camposFormulario[0];
String apellido1 = camposFormulario[1];
String apellido2 = camposFormulario[2];
String edad = camposFormulario[3];


Si puede ser, sin demasiado lío de threads y familiares, pero veré a ver...
No te voy a engañar.
Todos hemos sido programados para normalizar la psicopatía de las élites económicas y políticas, y para realimentar su patrón de ciega codicia.