Problemas con Eventos

Fuentemilla
13 de Mayo del 2002
Buenos dias, tengo un problemilla y requeriria ayuda.

Dispongo de una applet en el que voy generando diferentes objetos creados por mi, como son unas cajas de texto que al clicar sobre una superficie determinada va incrementado el valor de la caja de texto, pero en ese mismo momento quiero que se me actualiza mediante un calculo otro objeto totalmente diferente pero que reside en el mismo applet.

Por si no me he explicado claro, lo que quiero es que cuando se produzca un evento sobre un objeto se me modifique el valor de otro( hacer referencia a el).

Es esto posible, yo creo que si, pero no se como!

Gracias por cualquier ayuda!

Fuentemilla
13 de Mayo del 2002
Gracias por vuestra ayuda pues gracias a vuestras sugerencias he conseguido solucionar mis problemas!!

Sois unos fieras !! xD;

Pelly
13 de Mayo del 2002
No he entendido bien tu pregunta, por que no se si creas los objetos en tiempo de ejecucion ,o son siempre existen los mismos objetos los que existen en el applet.

Si es lo primero podrias extender la clase del objeto añadiendole un metodo estatico llamado actualizar .
Por ejemplo supongamos un panel que indique el numero de clicks en un boton, esta etiqueta se crea cuando se pulsa por primera vez.

Public Contador extends JPanel {
protected static int numeroClicks = 0;
...
static public void actualizar () {
cuenta++;
}
...
}

Si es la segunda opcion, entonces podrias incluir una referencia al objeto que tienes que actualizar.

public BotonContador extends JButton {
Contador etiqueta;
// este es el constructor
public BotonContador (Contador c) {
etiqueta = c;
...
}
}

Una tercera opcion es que pongas el oyente dentro del Applet asi puedes llamar a cualquier objeto que este dentro de el, esta quizas es la solucion mas logica.

// esto va dentro del init del applet
Boton1.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) { Boton1ActionPerformed(e);
}
}};

//esto no esta dentro del init si no que es un
//metodo mas

public void Boton1ActionPerformed (ActionEvent e) {
// aqui llamas a un metodo que actualize
// el objeto
}

Bueno no se si me he explicado bien.

Un saludo

Luismahou
13 de Mayo del 2002
Según la información que has dado imagino que tienes algo como esto:
El objeto caja de texto que incrementa su valor.
El objeto que quieres que cambie cuando cambia la caja de texto.
Y un objeto "controlador" que tiene acceso a los otros dos objetos.

Teniendo en cuenta esto lo que necesitas es enterarte de los cambios de la caja de texto mediante el "controlador" para luego informar al otro objeto.

Para ello puedes optar por añadirle un escuchador a la caja de texto desde el "controlador". Uno que se ajustaría es el PropertyChangeListener. Este escuchador permite que un objeto se entere de los cambios en las propiedades que se producen en el objeto que están escuchando.

Con código:

// Código del "controlador"
cajaTexto.addPropertyChangeListener( new PropertyChangeListener) {
public void propertyChange(PropertyEvent e) {
// Este método se ejecutará cada vez que se alguna propiedad de la caja de texto cambie.
// Aquí tienes que detectar el cambio en el incremento y notificar al otro objeto que quieres actualizar
}
});

Para completar lo anterior tienes que llamar desde la caja de texto al método firePropertyChange(NombrePropiedad, AntiguoValor, NuevoValor) cada vez que incrementa su valor. Este método notifica a todos los escuchadores que la propiedad "NombrePropiedad" ha cambiado. Por tanto, el escuchador que hemos puesto en el "controlador" se enteraría del cambio y sólo necesitarías notificárselo al otro objeto.

Este escuchador sólo es válido si tu caja de texto hereda de JComponent, porque este objeto ya implementa los métodos addPropertyChangeListener y el firePropertyChange(). Si no hereda de JComponent necesitas crearte un escuchador que haga la misma función. Para ello tienes que hacer lo siguiente:
-Definir una interfaz, p.e: CajaTextoListener con un método incrementoPerformed(CajaTextoEvent). Este método es el que deberían implementar todos los objetos que quisieran detectar un incremento en la caja de texto.
-Definir dentro de la clase Caja de Texto tres métodos: addCajaTextoListener(CajaTextoListener), removeCajaTextoListener(CajaTextoListener), y fireIncrementoPerformed(CajaTextoEvent). La implementación es fácil:
dentro del método add tienes que añadir a un vector el objeto que recibe como parámetro (en este caja un CajaTextoListener), en el remove eliminar el objeto, y en el fire recorrer el vector de CajaTextoListener y para cada uno de esos objetos llamar al método incrementoPerformed().

Bueno, después de este rollo espero que te haya quedado claro (aunque no sé si me he explicado muy bien). Creo que lo que buscas va por ahí. Si tienes alguna duda coméntamelo.

Luismahou