Ver Mensaje Individual
  #2 (permalink)  
Antiguo 25/06/2014, 06:42
TheDave86
 
Fecha de Ingreso: diciembre-2010
Mensajes: 14
Antigüedad: 13 años, 5 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