elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Ayuda con alcance de variables, Aprendiendo Java.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con alcance de variables, Aprendiendo Java.  (Leído 2,138 veces)
Darknessfeatsunny

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Ayuda con alcance de variables, Aprendiendo Java.
« en: 24 Junio 2014, 18:10 pm »

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 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:

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


« Última modificación: 24 Junio 2014, 18:38 pm por Darknessfeatsunny » En línea

gordo23

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Ayuda con alcance de variables, Aprendiendo Java.
« Respuesta #1 en: 24 Junio 2014, 19:09 pm »

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.-


En línea

Darknessfeatsunny

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Ayuda con alcance de variables, Aprendiendo Java.
« Respuesta #2 en: 25 Junio 2014, 14:35 pm »

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:


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
« Última modificación: 25 Junio 2014, 14:42 pm por Darknessfeatsunny » En línea

gordo23

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Ayuda con alcance de variables, Aprendiendo Java.
« Respuesta #3 en: 26 Junio 2014, 03:29 am »

Vas a tener que leer sobre clases anidadas entonces:

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Saludos y suerte.-
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con código (aprendiendo java)
Java
Minina89 2 1,926 Último mensaje 14 Enero 2013, 01:09 am
por Minina89
Aprendiendo Java gracias al videojuego CodeSpells
Noticias
wolfbcn 3 3,013 Último mensaje 10 Abril 2013, 17:45 pm
por Puntoinfinito
[Tutorial] Aprendiendo a Programar En Java 7 -- Capitulo 1
Java
kaltorak 0 2,095 Último mensaje 5 Agosto 2013, 11:55 am
por kaltorak
Aprendiendo Java « 1 2 3 4 »
Foro Libre
Soulking 30 10,043 Último mensaje 1 Septiembre 2014, 16:27 pm
por WHK
ayuda variables java
Java
jdbc51 2 1,510 Último mensaje 9 Marzo 2015, 03:55 am
por PabloPbl
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines