Foro de elhacker.net

Programación => Java => Mensaje iniciado por: zonahurbana en 7 Febrero 2014, 00:27 am



Título: Sobre lectura de varios datos a la vez
Publicado por: zonahurbana en 7 Febrero 2014, 00:27 am
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


Título: Re: Sobre lectura de varios datos a la vez
Publicado por: egyware en 7 Febrero 2014, 00:48 am
Si usas un JTextField puedes obtener los datos utilizando la función getText (http://docs.oracle.com/javase/6/docs/api/javax/swing/text/JTextComponent.html#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!


Título: Re: Sobre lectura de varios datos a la vez
Publicado por: zonahurbana en 7 Febrero 2014, 01:08 am
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...


Título: Re: Sobre lectura de varios datos a la vez
Publicado por: ThinkByYourself en 7 Febrero 2014, 11:30 am
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.


Título: Re: Sobre lectura de varios datos a la vez
Publicado por: 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á.


Título: Re: Sobre lectura de varios datos a la vez
Publicado por: trolleoatodos en 7 Febrero 2014, 18:34 pm
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


Título: Re: Sobre lectura de varios datos a la vez
Publicado por: 1mpuls0 en 7 Febrero 2014, 19:06 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
  1. package ehn;
  2.  
  3. /**
  4.  * @author 1mpuls0
  5.  */
  6.  
  7. public class Example extends javax.swing.JFrame {
  8.  
  9.    private javax.swing.JTextField jTextField1;
  10.  
  11.    public static void main(String args[]) {
  12.        new Example().setVisible(true);
  13.    }
  14.  
  15.    public Example() {
  16.        initComponents();
  17.    }
  18.  
  19.    private void initComponents() {
  20.  
  21.        jTextField1 = new javax.swing.JTextField();
  22.        /*IMPORTANTE*/
  23.        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
  24.  
  25.        /*IMPORTANTE*/
  26.        addWindowListener(new java.awt.event.WindowAdapter() {
  27.            public void windowClosing(java.awt.event.WindowEvent evt) {
  28.                formWindowClosing(evt);
  29.            }
  30.        });
  31.  
  32.  
  33.        getContentPane().setLayout(new java.awt.FlowLayout());
  34.  
  35.        jTextField1.setPreferredSize(new java.awt.Dimension(100, 20));
  36.        getContentPane().add(jTextField1);
  37.  
  38.        pack();
  39.    }
  40.  
  41. private void formWindowClosing(java.awt.event.WindowEvent evt) {
  42.    String var = jTextField1.getText().toString().trim();
  43.    if(var.equals("")) {
  44.        javax.swing.JOptionPane.showMessageDialog(null, "Existen campos vacios");
  45.    }else {
  46.        this.setVisible(false);
  47.    }
  48.  
  49. }
  50.  
  51. }
  52.  


Título: Re: Sobre lectura de varios datos a la vez
Publicado por: zonahurbana en 7 Febrero 2014, 19:58 pm
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.


Título: Re: Sobre lectura de varios datos a la vez
Publicado por: ThinkByYourself en 3 Marzo 2014, 12:56 pm
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!


Título: Re: Sobre lectura de varios datos a la vez
Publicado por: ThinkByYourself en 3 Marzo 2014, 13:04 pm
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
  1. String camposFormulario [] = MiDialogo.mostrar();
  2. String nombre = camposFormulario[0];
  3. String apellido1 = camposFormulario[1];
  4. String apellido2 = camposFormulario[2];
  5. String edad = camposFormulario[3];
  6.  

Si puede ser, sin demasiado lío de threads y familiares, pero veré a ver...