Pasar datos entre dos ventanas

De ChuWiki
Saltar a: navegación, buscar

Imagina que tienes dos ventanas -Ventana1 y Ventana2- y quieres pasar datos de una a otra en un momento dado. Por ejemplo, al pulsar un botón en ventana1 quieres pasar un texto a ventana2 para que esta lo muestre en un JLabel.

Lo primero es poner un método setText(String texto) a ventana2. En este método se pone el texto en el JLabel. El código puede ser así

public class Ventana2 extends JDialog
{
   private JLabel etiqueta = new JLabel ("su texto aquí");
   ...
   public void setText (String elTexto)
   {
      etiqueta.setText(elTexto);
   }
}

Ahora, para Ventana1 se nos presentan varias posibilidades, según como instanciemos Ventana1 y Ventana2.

Si Ventana1 es la que hace el new de Ventana2, simplemente tendremos llamar al método setText() en el ActionListener del botón. El código puede ser así

public class Ventana1 extends JDialog
{
   private Ventana2 v2 = new Ventana2();
   private JButton boton = new JButton("Pulsame");
   ...
   public Ventana1()
   {
      boton.addActionListener (new ActionListener() {
         public void actionPerformed (ActionEvent e) {
            v2.setText("El texto");
         }
      });
   }
}

Otra posibilidad es que Ventana1 no instancie a Ventana2, sino que se haga el new de ambas ventanas desde código en otro sitio, por ejemplo, en el main() de nuestro programa.

public class ClasePrincipal
{
   public static void main(String [] args)
   {
      Ventana1 v1 = new Ventana1();
      Ventana2 v2 = new Ventana2();
      ...
   }
}

En este caso, se nos presentan dos posibilidades. Una de ellas es poner a Ventana1 un método setVentana2(Ventana2 v2) de forma que a Ventana1 le pasamos la Ventana2 para que se la guarde. De esta manera estaríamos igual que en el primer caso.

public class Ventana1 extends JDialog
{
   private Ventana2 v2=null;
   private JButton boton = new JButton("Pulsame");
   ...
   public Ventana1()
   {
      boton.addActionListener (new ActionListener() {
         public void actionPerformed (ActionEvent e) {
            // No tenemos garantía de que alguien nos haya
            // pasado v2, así que debemos verificar que no
            // sea null.
            if (v2 != null)
               v2.setText("El texto");
         }
      });
   }
   public void setVentana2 (Ventana2 laVentana2)
   {
      v2 = laVentana2;
   }
}

// y en el main...

public class ClasePrincipal
{
   public static void main(String [] args)
   {
      Ventana1 v1 = new Ventana1();
      Ventana2 v2 = new Ventana2();
      v1.setVentana2(v2);
   }
}

Esta opción no es elegante en el sentido de la orientación a objetos, ya que estamos haciendo que Ventana1 vea a Ventana2 directamente y por tanto, dependa de ella. Por ello, es mejor otra solución, como puede ser añadir un método addActionListener (ActionListener listener) a Ventana1. Este método añadiría ese listener al botón. Desde el código del main añadiríamos el listener que se encargaría de poner el texto en Ventan2. Vaya, más o menos lo siguiente:

public class Ventana1 extends JDialog
{
   private JButton boton = new JButton("Pulsame");
   ...
   /* Le pasa el listener directamente al boton */
   public void addActionListener (ActionListener listener)
   {
      boton.addActionListener (listener);
   }

   /* Método que nos haría falta si Ventana1 es la que 
      tiene que decidir qué texto es el que hay que poner
      en ventana2. */
   public String getText()
   {
      return "El texto para ventana2";
   }
}


// y en el main ....

public class ClasePrincipal
{
   public static void main(String [] args)
   {
      // Es importante el final para no obtener
      // errores de compilado, o bien habría que
      // poner ambas variables como atributos de 
      // la clase.
      final Ventana1 v1 = new Ventana1();
      final Ventana2 v2 = new Ventana2();
      v1.addActionListener (new ActionListener() {
         public void actionPerformed (ActionEvent e) {
            v2.setText(v1.getText());
         }
      });
   }
}

Seguramente hay muchas más posibilidades, tantas como nos permita nuestra imaginación.