Pasar datos entre dos ventanas
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.