Ayuda con alcance de variables, Aprendiendo Java.

Iniciado por Darknessfeatsunny, 24 Junio 2014, 18:10 PM

0 Miembros y 2 Visitantes están viendo este tema.

Darknessfeatsunny

Hola, muy buenas, estoy aprendiendo Java, y me surge un problema. Cuando dentro de una clase declaro unos atributos (variables) y declaro sus métodos, es fácil acceder a cada uno de esos atributos simplemente con llamarlos:


class myclase(){
 
  int atributo1;

  public void setAtributo(int val){
     this.atributo1=val;  //Accedo directam[/font]ente al atributo1
  }
}



Bien. Mi duda surge cuando declaro eventos (u otras funciones) dentro de un método. Por ejemplo, si dentro del método setAtributo declaro lo siguiente:



public void setAtributo(int val){
  this.atributo1=val;

  public void setAtributo(int val){
     textFielDeclarado.addFocusListener(  //imaginamos que "textFielDeclarado" esta correctamente declaro y funcionaltamente declaro y funcional
        new FocusListener() {
            //@Override
           public void focusGained(FocusEvent arg0) {
              System.out.println( (atributo1); //ERROR: Aqui no me da acceso al atributo
           }
        }
     );
  }

}




Se que al ejemplo se le pueden sacar mucho errores, no era mi intención poner algo real. Sólo comprender como debo acceder a esos atributos/variables.


Dentro del evento "public void focusGained(FocusEvent arg0)" en concreto (o de cualquier otra función dentro del método) no tengo acceso a atributo1.

Gracias

gordo23

Yo puedo acceder normalmente si atributo1 lo declaro como private:

private int atributo1;

Sino también de esta forma me ha funcionado:

System.out.println(MiClase.this.atributo1); //Siendo MiClase la que contenga a atributo1

Fijate si así te funciona. Saludos y suerte.-

Darknessfeatsunny

#2
Muchas gracias por responder, en realidad en parte tienes razón, y soluciona parte de mi problema. Pero en el ejercicio real no es tan facil. Lo pongo a continuacion, no lo queria poner por su extension, voy a resumirlo un poco y lo pongo tal como es en realidad:




class Main {

private JFormattedTextField[][] textFieldCasilla;

//Vars
private int casX, casY;


private void makeTextfields(){
// CAJAS DE TEXTO
this.textFieldCasilla = new JFormattedTextField[9][9];

for (int n=0; n<9; n++) {
for (int m=0; m<9; m++){
this.textFieldCasilla[n][m] = new JFormattedTextField();

this.textFieldCasilla[n][m].setHorizontalAlignment(SwingConstants.CENTER);
this.textFieldCasilla[n][m].setBackground(Color.WHITE);
this.textFieldCasilla[n][m].setBorder(null);
this.textFieldCasilla[n][m].setEditable(false);
this.textFieldCasilla[n][m].setFocusable(true);
this.textFieldCasilla[n][m].setFont(new java.awt.Font("Arial", java.awt.Font.PLAIN, 35));
this.textFieldCasilla[n][m].setText(Integer.toString(m+1));
this.textFieldCasilla[n][m].setBounds((m*40)+3, (n*40)+3, 35, 35);

this.textFieldCasilla[n][m].addFocusListener(
new FocusListener() {

@Override
public void focusGained(FocusEvent arg0) {
setPosCasilla(n, m);                                  //<------------------------------------ERROR 1*
textFieldCasilla[0][0].setBackground(Color.GREEN);    //<------------------------------------ERROR 2*
casX=2;                                               //<------------------------------------ERROR 3*
casY=2;                                               //<------------------------------------ERROR 4*
System.out.println( getPosCasillaX() + "," + getPosCasillaY() );
arg0.getComponent().setBackground(new Color(215, 250, 205));
}

@Override
public void focusLost(FocusEvent arg0) {
arg0.getComponent().setBackground(Color.WHITE);
}
}
);

}
}

}

public int getPosCasillaX(){
return (this.casX);
}

public int getPosCasillaY(){
return (this.casY);
}

public void setPosCasilla(final int x, final int y){
this.casX = x;
this.casY = y;
}

public static void main(String[] args) {

}

}



*LEYENDA
ERROR 1: Variables n y m no declaradas, no me deja acceder a los indices de los bucles for.
ERROR 2: no me deja acceder a textFieldCasilla[1][3] o cualquier otro objeto (botón, textos) de la clase, no existen dentro de este evento. Se que puedo acceder al textFieldCasilla que genera el evento con arg0.getComponent(), pero yo quiero acceder a otros objetos de la clase.
ERROR 3: Tampoco a los atributos propios de la clase. Se "soluciona" con Main.this.casX=2; pero parece una solución cuestionable. Tampoco me interesa modificar su accesibilidad con "public".
ERROR 4: Tampoco a los atributos propios de la clase. Se "soluciona" con Main.this.casY=2; pero parece una solución cuestionable. Tampoco me interesa modificar su accesibilidad con "public".

Este es el codigo, es funcional, lo podeis probar (aunque no vereis nada, ya que no muestra nada). Podreis modificarlo para ver los errores que  mi me da. Lo he podificado incluyendo esas lineas de error solo para que veais que es lo que quiero aprender. Se que las lineas hacen cosas que no tienen sentido en el programa. Solo es para solucionar el problema.

El ejercicio trata en general de hacer un sudoku, al menos funcional. Bueno, a parte de esto. Si mirais el code, veis que es solo la especificacion de una matriz de JFormatedTextFields llamados textFieldCasilla[][]. Utilizo un doble for para colocar indices y posiciones y otros atributos al textFieldCasilla[][].

Mi duda es cómo realizar esas operaciones sobre eso atributos y objetos. Como veis tengo creados un par (getPosCasillaX/Y() setPosCasilla(int int)) de metodos "puente" para acceder y establecer a casX y casY. Pero la idea es saber si hay forma "directa" de hacerlo. casX y casY son varibles en el tiempo de ejcucion, es decir no pueden ser static/final.

Gracias

gordo23