Ver Mensaje Individual
  #3 (permalink)  
Antiguo 06/04/2009, 04:41
Avatar de chuidiang
chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Actualizar JPanels de un típico JFrame

Hola:

En el primer post, el código que pones par el JFrame no está muy claro, ya que declaras la clase y te pones a hacer código directamente, sin poner constructor ni nada.

En el propertyChangeListener (y en cualquier listener/hilo en general) no puesdes usar una variable local de otro sitio (en tu caso, eastPanel). Ten en cuenta que el listener se ejecuta más adelante, cuando cambie la propiedad y es posible que la variable local haya desaparecido entonces (no su contenido, sino la variable). En el siguiente ejemplo

Código:
public void unMetodo (...) {
   int unaVariableLocal = ...;
   unBoton.addActionListener (new ActionListener () {
      public void actionPerformed(ActionEvent e) {
           // Aquí no puedo usar unaVariableLocal.
      }
   });
}
unaVariableLocal existe mientras estás en unMetodo(), pero la ejecución de unMetodo() puede haber acabado mucho antes de que pulses el botón y se ejecute el actionPerfomed, por lo que unaVariableLocal hace tiempo que ha dejado de existir y por eso no puede usarse.

Si quieres usar esa variable (eastPanel), debes declararlo como atributo de la clase, así existe mientras existe la clase.

Código:
public class UnaClase {
    int unaVariable;

   public void unMetodo (...) {
      unaVariable = ...;
      unBoton.addActionListener (new ActionListener () {
      public void actionPerformed(ActionEvent e) {
           // Aquí SI puedes usar unaVariable
      }
   });
}
La otra opción, aunque a mí me gusta menos, es dejar la variable como local, pero declararla final. De esta forma, sí se tiene acceso a ella.

Código:
public void unMetodo (...) {
   final int unaVariableLocal = ...;
   unBoton.addActionListener (new ActionListener () {
      public void actionPerformed(ActionEvent e) {
           // Aquí SI puedo usar unaVariableLocal.
      }
   });
}
Una vez solucionado esto, supongo que queda resuelta la duda del segundo post. No necesitas que el mainframe vea el botón. Símplemente declara el eastPanel de la misma forma que has declarado el JButton. Me da la impresión de que has usado la opción de final, pero ya te digo que no se puede saber seguro porque no has puesto si ese código está en un método o no.

Se bueno.
__________________
Apuntes Java
Wiki de Programación