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

Novato en Java

Estas en el tema de Novato en Java en el foro de Java en Foros del Web. Hola. Recien estoy comenzando en Java siguiendo diversos tutoriales y ya me he topado con mi primer problema. Me gustaría que me ayudaran a solucionarlo ...
  #1 (permalink)  
Antiguo 08/02/2011, 07:00
 
Fecha de Ingreso: febrero-2011
Mensajes: 6
Antigüedad: 13 años, 2 meses
Puntos: 0
Novato en Java

Hola.

Recien estoy comenzando en Java siguiendo diversos tutoriales y ya me he topado con mi primer problema. Me gustaría que me ayudaran a solucionarlo para poder comprender mejor esto de la orientación objetos y no arrastrar errores desde lo básico. El ejemplo está extraido de un tutorial y me extraña que esté mal, pero bueno:

Se trata de un applet cuya salida sean los números del 0 al 3. Y curiosamente me imprime los números del 3 al 6 :S

Archivo contador.java

Código:
public class Contador {			
  int cnt;	
  public Contador() {			
      cnt = 0;	
				
  }

  public int incCuenta() {			
      cnt++;				
		    return cnt;				
	  }
  public int getCuenta() {		
      return cnt;				
	  }  
}
Archivo Ejemplo2.java

Código:
import java.applet.*;
import java.awt.*;

public class Ejemplo2 extends Applet {
  static int n;
  static Contador laCuenta;

  // Constructor…
  public Ejemplo2 () {
    laCuenta = new Contador();
  }

  public void paint (Graphics g) {
    g.drawString ("Contando", 20, 20);
    g.drawString (String.valueOf(laCuenta.getCuenta()), 20, 35 );
    n = laCuenta.incCuenta();
    g.drawString (String.valueOf(n), 20, 50 );
    laCuenta.incCuenta();
    g.drawString (String.valueOf(laCuenta.getCuenta()), 20, 65 );
    g.drawString (String.valueOf(laCuenta.incCuenta()), 20, 80 );
  }
  
}
¿Porqué me inicia en 3?
¿Podría ser que al hacer uso de la misma clase en otra aplicación DOS (que sí me contó bien) el valor de la variable se quedase en 3?
¿Porque al crear la instancia no asigna el valor 0 a la variable?

Gracias
  #2 (permalink)  
Antiguo 08/02/2011, 07:46
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Novato en Java

Haces tres llamadas al método inCuenta(), por lo que si empiezas en 0 llegas a tres.

El problema que tienes es que los pinta, pero muy rápido. O metes un delay entre cada una de las llamadas, o haces esas llamadas mediante eventos.

Editado: No sé nada de swing, pero me imagino que los drawstring pintaran los resultados en la posición que le marcas, así que no sé por qué no te salen. Lo importante es que si tsólo te sale un 3, es que los correspondientes a 1 y 2 no los pinta aunque sí los haga.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 08/02/2011, 08:23
 
Fecha de Ingreso: septiembre-2007
Mensajes: 268
Antigüedad: 16 años, 7 meses
Puntos: 8
Respuesta: Novato en Java

Lo que no entiendo porque los atributos de la clase tienen que ser static es decir globales si los instancias. Yo quitaria el static porque son atributos locales de la clase.
  #4 (permalink)  
Antiguo 08/02/2011, 09:12
 
Fecha de Ingreso: febrero-2011
Mensajes: 6
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Novato en Java

Cita:
Iniciado por Xerelo Ver Mensaje
Haces tres llamadas al método inCuenta(), por lo que si empiezas en 0 llegas a tres.

El problema que tienes es que los pinta, pero muy rápido. O metes un delay entre cada una de las llamadas, o haces esas llamadas mediante eventos.

Editado: No sé nada de swing, pero me imagino que los drawstring pintaran los resultados en la posición que le marcas, así que no sé por qué no te salen. Lo importante es que si tsólo te sale un 3, es que los correspondientes a 1 y 2 no los pinta aunque sí los haga.
No digo que no me los imprima, la impresión me la hace bien, pero en vez de sacarme en pantalla: 0 1 2 3, me saca 3 4 5 6.
  #5 (permalink)  
Antiguo 08/02/2011, 09:22
 
Fecha de Ingreso: febrero-2011
Mensajes: 6
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Novato en Java

Otra cosa de la que me debo de dar cuenta. Al redimensionar la ventana del applet el incremento se sigue produciendo, pero cada redimensión que hago se salta tres números.

Es decir, al ejecutar me imprime 3 4 5 6 y al redimensionar la ventana, en vez de imprimir 6 7 8 9, me imprime 9 10 11 12. No entiendo porqué siempre se salta tras números
  #6 (permalink)  
Antiguo 08/02/2011, 14:09
Avatar de jcMouse  
Fecha de Ingreso: noviembre-2009
Ubicación: Bolivia
Mensajes: 116
Antigüedad: 14 años, 5 meses
Puntos: 9
Respuesta: Novato en Java

vamos por partes dijo jack el destripador

lo primero que debes saber es que en la programacion orientada a objetos, haces eso, utilizas objetos y cada objeto tiene sus propios metodos lo que lo diferencia de la programacion estructura

ahora el applet esta bien y hace lo que tiene que hacer, lo que tu debes hacer es analizar el codigo parte por parte, debes comprender que es lo que hace:

Código java:
Ver original
  1. public class applet extends Applet  {
  2.    int n;
  3.    contador laCuenta;
  4.  
  5.   // Constructor…
  6.   public applet () {
  7.       //se crea el objeto, el valor es 0
  8.     laCuenta = new contador();
  9.   }
  10.  
  11.   public void paint (Graphics g) {
  12.     g.drawString ("Contando", 20, 20);
  13.     //se obtiene y se pinta el valor del objeto = 0
  14.     g.drawString (String.valueOf(laCuenta.getCuenta()), 20, 35 );
  15.     //se incrementa el valor de la cuenta = 1 y se asiga a la variable "n"
  16.     n = laCuenta.incCuenta();
  17.     //se pinta el nuevo valor = 1 que esta en la variable "n"
  18.     g.drawString (String.valueOf(n), 20, 50 );
  19.     //se incrementa el valor de la cuenta = 2
  20.     laCuenta.incCuenta();
  21.     //se pinta el valor = 2
  22.     g.drawString (String.valueOf(laCuenta.getCuenta()), 20, 65 );
  23.     //se incrementa y se pinta el valor = 3
  24.     g.drawString (String.valueOf(laCuenta.incCuenta()), 20, 80 );
  25.   }
  26.  
  27. }

hasta aqui el objeto contador tiene el valor de 3

el metodo PAINT pinta lo que ves en el applet una y otra vez, y por tanto ejecuta todo el codigo que este dentro del PIANT una y otra vez, es por eso que al redimensionar el applet se ejecuta el codigo del objeto "cuenta", pero no desde cero, ¿porque? porque no estas creando el objeto de nuevo, sino estas utilizando el mismo objeto y como este objeto tenia el valor 3, comienza desde ahi, en el siguiente ciclo, este tendra el valor de 6,9,12, etc

si no quieres que eso suceda, lo unico que tienes que hacer es CREAR EL OBJETO DE NUEVO

el codigo queda de la siguiente forma:

Código PHP:
public class applet extends Applet  {
   
int n;
   
contador laCuenta;

  
// Constructor…
  
public applet () {
    
  }
  
  public 
void paint (Graphics g) {
    
//se crea el objeto, el valor es 0
    
laCuenta = new contador();
    
g.drawString ("Contando"2020);
    
//se obtiene y se pinta el valor del objeto = 0
    
g.drawString (String.valueOf(laCuenta.getCuenta()), 2035 );
    
//se incrementa el valor de la cuenta = 1 y se asiga a la variable "n"
    
laCuenta.incCuenta();
    
//se pinta el nuevo valor = 1 que esta en la variable "n"
    
g.drawString (String.valueOf(n), 2050 );
    
//se incrementa el valor de la cuenta = 2
    
laCuenta.incCuenta();
    
//se pinta el valor = 2
    
g.drawString (String.valueOf(laCuenta.getCuenta()), 2065 );
    
//se incrementa y se pinta el valor = 3
    
g.drawString (String.valueOf(laCuenta.incCuenta()), 2080 );
  }


asi no importa cuantas veces redimensiones el applet, siempre pintara los valores 0,1,2,3 porque estas creando el objeto cada vez, esto claro no es lo mas eficiente, otra forma es modificar el codigo de la clase "contador" e implementr un metod que reinicie el contador a CERO

Código PHP:
public class contador {            
  
int cnt;    
  public 
contador() {            
      
cnt 0;                    
  }

  public 
int incCuenta() {            
      
cnt++;                
            return 
cnt;                
      }
  public 
int getCuenta() {        
      return 
cnt;                
      }  
  
//NUEVO METODO
 
public void reiniciar(){
    
cnt 0;
 } 
 

y el applet queda
Código PHP:
public class applet extends Applet  {
   
int n;
   
contador laCuenta;

  
// Constructor…
  
public applet () {
    
//se crea el objeto, el valor es 0
    
laCuenta = new contador();
  }
  
  public 
void paint (Graphics g) {    
    
g.drawString ("Contando"2020);
    
//se obtiene y se pinta el valor del objeto = 0
    
g.drawString (String.valueOf(laCuenta.getCuenta()), 2035 );
    
//se incrementa el valor de la cuenta = 1 y se asiga a la variable "n"
    
laCuenta.incCuenta();
    
//se pinta el nuevo valor = 1 que esta en la variable "n"
    
g.drawString (String.valueOf(n), 2050 );
    
//se incrementa el valor de la cuenta = 2
    
laCuenta.incCuenta();
    
//se pinta el valor = 2
    
g.drawString (String.valueOf(laCuenta.getCuenta()), 2065 );
    
//se incrementa y se pinta el valor = 3
    
g.drawString (String.valueOf(laCuenta.incCuenta()), 2080 );
    
//se reinicia el contador a CERO
    
laCuenta.reiniciar();
  }


y listo

se malo, malisimo
__________________
Problem?
Estoy aquí
Foro Code Army
  #7 (permalink)  
Antiguo 08/02/2011, 14:56
 
Fecha de Ingreso: febrero-2011
Mensajes: 6
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Novato en Java

Muchas gracias por tu respuesta. Efectivamente queda todo solucionado de ambas formas.

Realmente lo entendía todo bien pero me confundía enormemente que no se imprimieran los valores correctos.

Gracias nuevamente. Estaba todo muy bien explicado. : )

Etiquetas: Ninguno
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 04:18.