Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Duda sobre alcance de variables, Aprendiendo Java.

Estas en el tema de Duda sobre alcance de variables, Aprendiendo Java. en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 24/06/2014, 09:16
 
Fecha de Ingreso: diciembre-2010
Mensajes: 14
Antigüedad: 13 años, 4 meses
Puntos: 0
Duda sobre alcance de variables, Aprendiendo Java.

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:

Código:
class myclase(){
   
   int atributo1;

   public void setAtributo(int val){
      this.atributo1=val;  //Accedo directamente 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:

Código:
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
  #2 (permalink)  
Antiguo 25/06/2014, 06:42
 
Fecha de Ingreso: diciembre-2010
Mensajes: 14
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Duda sobre alcance de variables, Aprendiendo Java.

Nadie? no se si no me explico bien, voy a poner el ejemplo real. Lo pongo a continuacion, no lo queria poner por su extension, voy a resumirlo un poco y lo pongo tal como es en realidad:


Código:
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
  #3 (permalink)  
Antiguo 25/06/2014, 06:56
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Duda sobre alcance de variables, Aprendiendo Java.

Hola:

Si copio y pego el código en eclipse solo marca el error1, con los otros no tengo problemas.

El error1 se debe a que n y m son variables locales al for y desaparecen al terminar el for. Ten en cuenta que tu método focusGained() NO se ejecuta en el for, sino mucho mas adelante, cuando el textfield gane el foco y posiblemente el for haga rato que ha terminado.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #4 (permalink)  
Antiguo 25/06/2014, 07:39
 
Fecha de Ingreso: diciembre-2010
Mensajes: 14
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Duda sobre alcance de variables, Aprendiendo Java.

Pues tienes razon....

Bueno, y existe forma de alguna manera saber los indices de ese elemento en concreto que gana/pierde el foco?
  #5 (permalink)  
Antiguo 25/06/2014, 07:46
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Duda sobre alcance de variables, Aprendiendo Java.

Estás metiendo el focus listener dentro de los bucles, por lo que estás metiendo NxM listeners, uno en cada textfield. En vez de usar una clase anonima puedes crear una clase que implemente FocusListener y en el constructor ponerle el n y m correspondiente. Algo asi

Código Java:
Ver original
  1. for (int n ...) {
  2.    for (int m ...) {
  3.            ....
  4.            this.textFieldCasilla[n][m].addFocusListener( new TuListener(n,m) );

Haz la clase TuListener dentro de la clase Main (o la que sea), no estoy seguro si así tendrá o no acceso a los demás atributos, pero sería cuestión sólo de pasarselos en el constructor si no tiene acceso. Desde luego, si la haces como una clase normal fuera de la clase Main, seguro que no tiene acceso.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #6 (permalink)  
Antiguo 25/06/2014, 10:18
 
Fecha de Ingreso: diciembre-2010
Mensajes: 14
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Duda sobre alcance de variables, Aprendiendo Java.

focuslistener es una interfaz, si la extiendo en otra interfaz myfocuslistener no puede llevar constructor...no?

estoy en pleno aprendizaje de java...
  #7 (permalink)  
Antiguo 25/06/2014, 10:47
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Duda sobre alcance de variables, Aprendiendo Java.

FocusListener es una interfaz, pero la "extiendes" (implementas) con una clase, así puedes ponerle constructor e instanciarla. Si la extiendes con otra interfaz no puedes ponerle código.

Código Java:
Ver original
  1. public class TuListener implements FocusListener {
  2.    public TuListener ( int n, int m, ....) {
  3.       ...
  4.    }
  5.    ....
  6. }

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: alcance, clase, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:18.