style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Comportación extraña en Jlist y ArrayList (O...programador extraño?)

Buen día comunidad. El día de ayer me encontré con algo inusual para mí. Soy nuevo en el mundo del SWING y me ha tocado leer para poder tener lo que he hecho en estos dos días. Sin embargo, el día de ayer por la noche me encontré con éste pequeño asunto. Mi GUI es la siguiente:

El problema es con el JList, se supone que la lista debería de ser:

Rectángulo 1
Círculo 1
Triángulo 1
Rectángulo 2
Círculo 2
Triángulo 2

Si vuelvo a dibujar tres figuras (1 de cada una), toda la lista se convertirá en "NombreDeFigura 3".

La lógica está en POO, donde tengo una super clase llamada Figura:

public abstract class Figura {
    public Point[] puntos;
    public int clicsRecibidos;

    public abstract int numPtos();
   
    public abstract void dibujar(Graphics dw);

    public void agregaPunto(Point punto) {
        puntos[clicsRecibidos - 1] = punto;
    }
}

Las clases hijos que heredan Figura:

public class Rectangulo extends Figura {  
    private static int numRectangulos = 0;

    public Rectangulo() {
        numRectangulos++;
    }
   
    public void dibujar(Graphics dw) {
    dw.drawRect(Math.min(puntos[0].x, puntos[1].x), Math.min(puntos[0].y, puntos[1].y), Math.abs(puntos[0].x - puntos[1].x), Math.abs(puntos[0].y-puntos[1].y));
}

    public int numPtos() {
        return 2;
    }

    public String toString() {
        return "Rectángulo " + numRectangulos;
    }  
}

Tengo una Clase llamada Modelo, la cual uso para agregar los elementos a mi JList:

public class Modelo extends AbstractListModel{
    ArrayList<Figura> figuras;
   
    public Modelo(){
        figuras = new ArrayList<Figura>();
    }
   
    public int getSize() {
    return figuras.size();
        }

    public Figura getElementAt(int index) {
        return figuras.get(index);
    }
   
    public void add(Figura f){
        figuras.add(f);
        System.out.println(f.puntos[0]);
        System.out.println(f.puntos[1]);
        fireIntervalAdded(this, figuras.size()-1, figuras.size());
    }  
}

Mi Lista la inicializo de ésta forma:

jList1 = new javax.swing.JList();

jList1.setModel(modelo = new Modelo());

jScrollPane1.setViewportView(jList1);

Es así cómo simplemente en mi clase principal sólo debo hacer lo siguiente:
modelo.add(f);
donde f es un objeto de la clase figura.

Se me hace muy extraño el comportamiento, cambié de objeto Figura a objeto String (en el Generics de mi clase Modelo), mandando simplemente "f.toString", y ahí si me agrega todo bien en la lista. Estoy mandando el objeto entero porque quiero, una vez que el usuario termine de dibujar, guardar todos los datos en un archivo xml, así sólo tendría que recorrer el ArrayList y guardarlo en un archivo xml (claro, con sus respectivos métodos de parseo y demás).

Agradezco mucho si alguien podría decirme cual es mi error, ya que no lo encuentro. El programa me gustaría poder compartirlo al finalizarlo y que sirva para muchos de los que comienzan en POO.

Si a alguien le interesa, aquí está el .RAR con el proyecto

Saludos!!!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Jvan

static

Según yo es porque el contador private static int numRectangulos = 0; lo tienes como static o sea esta a nivel de clase por lo tanto independientemente de los objetos que crees, cuando lo incrementas se incrementa a nivel de clase no de objeto y como todos los objetos pueden ver esa variable de clase pues todos toman el valor actual que tenga.

Imagen de Algus Dark

Pero...

Si, es por eso que la he hecho static. Se caracteriza por ser propia de la clase y no de cada objeto. Así cada objeto que cree, debería de aumentar de "1 en 1" (P.E. Circulo 1, Circulo 2, Circulo 3). Pero al recorrer el ArrayList, éste se comporta de la manera:

  • [Circulo 1]
  • [Circulo 2, Circulo 2]
  • [Circulo 3, Circulo 3, Circulo 3]
  • Cómo digo en el post, si en la clase Modelo lo hago de esta forma:

    public class Modelo extends AbstractListModel{
        ArrayList<String> figuras;
       
        public Modelo(){
            figuras = new ArrayList<String>();
        }
       
        public int getSize() {
        return figuras.size();
            }
        public Figura getElementAt(int index) {
            return figuras.get(index);
        }
       
        public void add(Stringf){
            figuras.add(f);
            fireIntervalAdded(this, figuras.size()-1, figuras.size());
        }  
    }

    Y al agregarlo hago ésto en mi clase principal:
    modelo.add(f.toString);

    Si se comporta de la manera en que yo quisiera:

  • [Circulo 1]
  • [Circulo 1, Circulo 2]
  • [Circulo 1, Circulo 2, Circulo 3]
  • Imagen de ezamudio

    ok

    Ya Jvan te contestó. Efectivamente si quieres saber el número de figuras pues está bien que lleves la cuenta en una variable static, pero cada instancia debe tener su propia copia, es decir necesitas una variable de instancia y en el constructor incrementas la estática y copias el valor a la de instancia (y la de instancia es la que devuelves en toString().

    Imagen de ezamudio

    quisieras

    No se va a comportar de la manera en que tú quisieras, se va comportar de la manera en que lo programaste. Y lo que programaste es un contador de figuras que se incrementa cada que creas una nueva instancia, y el toString de cada instancia devuelve el total de figuras creadas.

    Imagen de Algus Dark

    Ohh...

    Mi error. Gracias @Jvan y @ezamudio. Creo que me tocará volver a darle un buen repaso a esto. Seguiré con el programa. Gracias!
    PD: Sabía que era el programador extraño.

    --- EDIT ---
    Ya lo arreglé. Nuevamente, muchas gracias por el dato.

    style="display:inline-block;width:728px;height:90px"
    data-ad-client="ca-pub-5164839828746352"
    data-ad-slot="7563230308">