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

[SOLUCIONADO] dibujar rectángulos con listas enlazadas simples

Estas en el tema de dibujar rectángulos con listas enlazadas simples en el foro de Java en Foros del Web. Hola comunidad, tengo un problemilla. Como ya domino un poco las listas simples en java e estado insertando, borrando, editando, ordenando etc... Se me a ...
  #1 (permalink)  
Antiguo 25/06/2014, 22:21
Avatar de freddy31DA  
Fecha de Ingreso: junio-2012
Mensajes: 84
Antigüedad: 11 años, 10 meses
Puntos: 2
Busqueda dibujar rectángulos con listas enlazadas simples

Hola comunidad, tengo un problemilla.
Como ya domino un poco las listas simples en java e estado insertando, borrando, editando, ordenando etc... Se me a ocurrido la idea de mostrar esos elementos en una interfaz grafica e estado dibujando en java 2D pero tengo inconvenientes ya que no me pinta nuevos rectángulos.

Cada vez que registro un elemento en la cordenada x se le multiplica por 2 ya que por defecto la puso en 100.
Dejo todo mi proyecto espero que me ayuden a representar las listas simples con java 2d. :

Lista.java
Código PHP:
package listassimples2d_freddyalc;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class 
Lista extends JPanel{
    
Elemento cabecera;    
    public 
Lista(){
        
cabecera null;
       }
                public 
void agregar_elemento(int xint yint aint h){
                    
Elemento nuevo = new Elemento();
                    
nuevo.setX(x);
                    
nuevo.setY(y);
                    
nuevo.setA(a);
                    
nuevo.setH(h);
                    if(
cabecera==null){
                        
cabecera nuevo;
                    }else{
                        
nuevo.setX(x*2);
                        
Elemento p cabecera;
                        while(
p.siguiente!=null){
                            
p.siguiente;
                        }
                        
p.siguiente nuevo;
                    }
                }
    
    
                    
    
        public 
void paint(Graphics nuevo){
                
                
                
                    
super.paintComponent(nuevo); //llama al metodo paint.
                    
this.setBackground(Color.WHITE);
                    
Elemento p cabecera;
                    while(
p!=null){
                             
nuevo.setColor(Color.RED);
                             
nuevo.fillRect(p.getX(), p.getY(), p.getA(), p.getH());
                             
p.siguiente;
                    }
                    
                 
            }
               
 
        
        } 
La clase elemento:
Código PHP:
package listassimples2d_freddyalc;


public class 
Elemento {
    
    
int x,y,a,h;
    
Elemento siguiente;
    
        public 
Elemento(){
           
            
siguiente null;
        }

    public 
Elemento(int xint yint aint h) {
        
        
this.x;
        
this.y;
        
this.a;
        
this.h;
    }

    public 
int getX() {
        return 
x;
    }

    public 
void setX(int x) {
        
this.x;
    }

    public 
int getY() {
        return 
y;
    }

    public 
void setY(int y) {
        
this.y;
    }

    public 
int getA() {
        return 
a;
    }

    public 
void setA(int a) {
        
this.a;
    }

    public 
int getH() {
        return 
h;
    }

    public 
void setH(int h) {
        
this.h;
    }

        
        
        
    

LA CLASE PRESENTACION

Código PHP:


package listassimples2d_freddyalc
;
import java.awt.Color;
import javax.swing.JFrame;
import java.util.Scanner;
public class 
Presentacion {
    static 
Scanner leer = new Scanner(System.in);
    static 
Lista  obj = new Lista();
          

        public static 
int menu(){
            
int opc;
            do{
           
System.out.println("---------------------- LISTAS MENU PRINCIPAL ----------------------");
           
System.out.println("Ingrese [1] uno para registrar un elemento");
           
System.out.println("Ingrese [2] para mostrar elementos.");
           
System.out.println("Ingrese [3] para SALIR");
           
System.out.print("\n >> ");
           
opc leer.nextInt();
           
            }while(
opc<|| opc>3);
           return 
opc;
        }
        
        public static 
void registrar(){
           
            
int xyah;
            
100;
            
40;
            
60;
            
55;
            
obj.agregar_elemento(xyah);
            
System.out.println("Elemento agregado correctamente.");
        }
        public static 
void mostrar(){
              
JFrame marco = new JFrame("Listas representación Grafica");  
              
marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              
              
Lista dibujar = new Lista();
              
dibujar.setBackground(Color.WHITE);
              
marco.add(dibujar);
              
marco.setSize(1000500);
              
marco.setVisible(true);
//            System.out.println(obj.mostrar_Elementos());
        
}
   
    public static 
void main(String[] args) {
       
           
int opc;
           do{
               
opc menu();
               
               switch(
opc){
                   case 
1:
                       
                       
registrar();
                       
                       break;
                       
                   case 
2:
                       
mostrar();
                       
                       break;
                       
                   case 
3:System.exit(0);
               
               }
           
           }while(
opc!=3);
        
    }


Si el método public void paint(....)
{.......}
tuviera solo esto dentro:

Código Java:
Ver original
  1. public void paint(Graphics nuevo){
  2.                
  3.                
  4.                
  5.                     super.paintComponent(nuevo); //llama al metodo paint.
  6.                     this.setBackground(Color.WHITE);
  7.                    
  8.                              nuevo.setColor(Color.RED);
  9.                              nuevo.fillRect(50, 90, 50, 60);
  10.                            
  11.                    
  12.        
  13.                  
  14.  
  15.                  
  16.             }

ME VA A DIBUJAR CORRECTAMENTE UN CUADRADO lo que quiero hacer arriba hacerlo dinámico. como ven agrego nuevos elementos en la clase presentación
espero que se entienda mi idea.. Por favor :(
Espero que me ayuden.
Gracias

Última edición por freddy31DA; 25/06/2014 a las 22:26 Razón: detalle
  #2 (permalink)  
Antiguo 26/06/2014, 01:25
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: dibujar rectángulos con listas enlazadas simples

Hola:

Estas haciendo dos new Lista(), uno se llama dibujar y otro se llama obj. En obj metes los elementos que creas con el menu, pero metes dibujar, que no tiene elementos, en el JFrame.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 26/06/2014, 10:44
Avatar de freddy31DA  
Fecha de Ingreso: junio-2012
Mensajes: 84
Antigüedad: 11 años, 10 meses
Puntos: 2
Respuesta: dibujar rectángulos con listas enlazadas simples

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

Estas haciendo dos new Lista(), uno se llama dibujar y otro se llama obj. En obj metes los elementos que creas con el menu, pero metes dibujar, que no tiene elementos, en el JFrame.

Se bueno.
Gracias men por la sugerencia, e intentado usar un solo objeto lista declarandola arriba en fin asi
Código Java:
Ver original
  1. static Lista  obj = new Lista();
y usar esta para crear el JFRAME


Código Java:
Ver original
  1. public static void mostrar(){
  2.               JFrame marco = new JFrame("Listas representación Grafica");  
  3.               marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  4.              
  5.              
  6.               obj.setBackground(Color.WHITE);
  7.               marco.add(obj);
  8.               marco.setSize(1000, 500);
  9.               marco.setVisible(true);
  10. //            System.out.println(obj.mostrar_Elementos());
  11.         }

En la lista en el metodo paint dibuje un cuadrado
Código Java:
Ver original
  1. public void paint(Graphics nuevo){
  2.                
  3.                
  4.                
  5.                     super.paintComponent(nuevo); //llama al metodo paint.
  6.                     this.setBackground(Color.WHITE);
  7.                    
  8.                              nuevo.setColor(Color.RED);
  9.                              nuevo.fillRect(50, 90, 50, 60);
  10.    
  11.             }
Al ejecutar presentación usando la opcion MOSTRAR si me dibujar el cuadrado ahora. No entiendo por que no me dibuja los cuadrados dinamicos si agrego 5 cordenadas debería de dibujarme 5 cuadrados. Estoy tratando de hacerlo dinámico volcando los elementos de la lista que en realidad son cordenadas y que generan nuevos fillRect();
Dinámico seria asi:
Código Java:
Ver original
  1. public void paint(Graphics nuevo){
  2.                
  3.                
  4.                
  5.                     super.paintComponent(nuevo); //llama al metodo paint.
  6.                     this.setBackground(Color.WHITE);
  7.                     Elemento p = cabecera;
  8.                     while(p!=null){
  9.                              nuevo.setColor(Color.RED);
  10.                              nuevo.fillRect(p.getX(), p.getY(), p.getA(), p.getH());
  11.                              p = p.siguiente;
  12.                     }
  13.                    
  14.                  
  15.             }

Al ejecutar esto solo me dibujar dos cuadrados. Al poner un ciclo dentro del metodo paint solo me dibuja los 5 cuadrados en la primera ronda del ciclo después ya no le hace caso
Código Java:
Ver original
  1. for (int i = 0; i < 10; i++) {
  2.                                 nuevo.setColor(Color.RED);
  3.                                 nuevo.fillRect(100, 90, 50, 60);
  4.                                 nuevo.fillRect(200, 90, 50, 60);
  5.                                 nuevo.fillRect(300, 90, 50, 60);
  6.                                 nuevo.fillRect(400, 90, 50, 60);
  7.                                 nuevo.fillRect(500, 90, 50, 60);
  8.                 }
Hasta e creado un contador cada vez que ingrese cont incrementa para usarla dentro del ciclo que está en el metodo paint el for no hace caso :(

E grabado este video men aver ayúdame

https://www.youtube.com/watch?v=4fvIfOoXkU8

el proyecto netbeans: https://www.mediafire.com/?kd7mv7td6q4ibha
  #4 (permalink)  
Antiguo 26/06/2014, 11:23
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: dibujar rectángulos con listas enlazadas simples

El código de registrar elemento ....

Código Java:
Ver original
  1. public static void registrar(){
  2.            
  3.             int x, y, a, h;
  4.             x = 100;
  5.             y = 40;
  6.             a = 60;
  7.             h = 55;
  8.             obj.agregar_elemento(x, y, a, h);
  9.             System.out.println("Elemento agregado correctamente.");
  10.         }

¿Estás añadiendo elementos siempre en las mismas coordenadas? Si es así, te estará pintando n rectángulos uno encima de otro y sólo verás 1, ya que estás dibujando una y otra vez lo mismo.

Idem con tu bucle de 10 que pinta 5 rectangulos. Si dibujas los mismos 5 rectangulos 10 veces, verás 5 rectangulos.


Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 26/06/2014, 13:11
Avatar de freddy31DA  
Fecha de Ingreso: junio-2012
Mensajes: 84
Antigüedad: 11 años, 10 meses
Puntos: 2
Respuesta: dibujar rectángulos con listas enlazadas simples

¿Estás añadiendo elementos siempre en las mismas coordenadas? Si es así, te estará pintando n rectángulos uno encima de otro y sólo verás 1, ya que estás dibujando una y otra vez lo mismo.

Idem con tu bucle de 10 que pinta 5 rectangulos. Si dibujas los mismos 5 rectangulos 10 veces, verás 5 rectangulos.


Se bueno.[/QUOTE]

Hola buenas, Al momento de registrar coordenadas lo que ago es agregar un nuevo elemento a lista. La primera vez es así: en la clase lista:
Código Java:
Ver original
  1. public void agregar_elemento(int x, int y, int a, int h){
  2.                     Elemento nuevo = new Elemento();
  3.                     nuevo.setX(x);
  4.                     nuevo.setY(y);
  5.                     nuevo.setA(a);
  6.                     nuevo.setH(h);
  7.                     if(cabecera==null){
  8.                         cabecera = nuevo;
  9.                     }
Por primer vez se registran las cordenadas: de la presentación:
Código Java:
Ver original
  1. public static void registrar(){
  2.            
  3.             int x, y, a, h;
  4.             x = 100;
  5.             y = 40;
  6.             a = 60;
  7.             h = 55;
  8.             obj.agregar_elemento(x, y, a, h);
  9.             System.out.println("Elemento agregado correctamente.");
  10.         }
Con esos valores, la cordenada más importante es la X, en el segundo registro multiplico la variable X por 2 que se ve en la clase lista en el metodo registrar:
Código Java:
Ver original
  1. if(cabecera==null){
  2.                         cabecera = nuevo;
  3.                     }else{
  4.                         nuevo.setX(x*2);
Bueno con está coordena ya con otro valor el cuadrado se va a desplazar a la derecha ya tendria valor 200 a la coordenada Y no le muevo nada por que es la que mantiene todos en forma horizontal..


En el ciclo for si así es E TENIDO UN ERROR LÓGICO en fin si ago esto:
y lo arreglo ya funciona el ciclo. Crea una variable x este su valor se le suma 100;

Código Java:
Ver original
  1. public void paint(Graphics nuevo){
  2.  
  3.                     super.paintComponent(nuevo); //llama al metodo paint.
  4.                     this.setBackground(Color.WHITE);
  5.                     int x = 0;
  6.                     for (int i = 0; i < 10; i++) {
  7.                                 x = x + 100;
  8.                                 nuevo.setColor(Color.RED);
  9.                                 nuevo.fillRect(x, 90, 50, 60);
  10.                                
  11.                     }
  12.                  
  13.             }
Con esto logro hacer que se dibujen los 100 cuadrados
[] [] [] [] [] [] [] [] [] []

Ahora la solución que e planteado a sido ya no tomar el valor original que viene de la clase presentación de la cordenada X. e creado una variable llamada guarda que se inicia en 0 está a incrementar de 100 en 100. Además modifique el ingrese de datos comun que usaba ahora inserto asi solo para este caso. :D

Código Java:
Ver original
  1. public void agregar_elemento(int x, int y, int a, int h){
  2.                     Elemento nuevo = new Elemento();
  3.                    
  4.                     if(cabecera==null){
  5.                             guarda = 100;
  6.                             nuevo.setX(guarda);
  7.                             nuevo.setY(y);
  8.                             nuevo.setA(a);
  9.                             nuevo.setH(h);
  10.                         cabecera = nuevo;
  11.                     }else{
  12.                          guarda = guarda + 100;
  13.                        
  14.                          nuevo.setX(guarda);
  15.                          nuevo.setY(y);
  16.                          nuevo.setA(a);
  17.                          nuevo.setH(h);
  18.                          
  19.                         Elemento p = cabecera;
  20.  
  21.                         while(p.siguiente!=null){
  22.                             p = p.siguiente;
  23.                         }
  24.                         p.siguiente = nuevo;
  25.                     }
  26.                 }
La variable guarda está creada al inicio de la clase por aquí
Código Java:
Ver original
  1. public class Lista extends JPanel{
  2.     Elemento cabecera;  
  3.     static int guarda = 0;  
  4.     public Lista(){
  5.         cabecera = null;
  6.        }
  7. ....................

Al final queda toda la clase lista.java así por el momento me falta agregar nombres a los elementos eso ya es facil.

Código Java:
Ver original
  1. package listassimples2d_freddyalc;
  2. import java.awt.Color;
  3. import java.awt.Graphics;
  4. import javax.swing.JPanel;
  5.  
  6. public class Lista extends JPanel{
  7.     Elemento cabecera;  
  8.     static int guarda = 0;  
  9.     public Lista(){
  10.         cabecera = null;
  11.        }
  12.                 public void agregar_elemento(int x, int y, int a, int h){
  13.                     Elemento nuevo = new Elemento();
  14.                    
  15.                     if(cabecera==null){
  16.                             guarda = 100;
  17.                             nuevo.setX(guarda);
  18.                             nuevo.setY(y);
  19.                             nuevo.setA(a);
  20.                             nuevo.setH(h);
  21.                         cabecera = nuevo;
  22.                     }else{
  23.                          guarda = guarda + 100;
  24.                        
  25.                          nuevo.setX(guarda);
  26.                          nuevo.setY(y);
  27.                          nuevo.setA(a);
  28.                          nuevo.setH(h);
  29.                          
  30.                         Elemento p = cabecera;
  31.  
  32.                         while(p.siguiente!=null){
  33.                             p = p.siguiente;
  34.                         }
  35.                         p.siguiente = nuevo;
  36.                     }
  37.                 }
  38.    
  39.                 public void mostrar_Cordenadas(){
  40.                         Elemento p = cabecera;
  41.                         String coordenadas="";
  42.                         while(p!=null){
  43.                            
  44.                             coordenadas += "x = "+ p.getX()+" y = "+ p.getY()+" ancho = "+p.getA()+" altura = "+p.getH()+"\n";
  45.                           p = p.siguiente;
  46.                      }
  47.                         System.out.println(coordenadas);
  48.                 }
  49.                    
  50.    
  51.        public void paint(Graphics nuevo){
  52.                
  53.                
  54.                
  55.                     super.paintComponent(nuevo); //llama al metodo paint.
  56.                     this.setBackground(Color.WHITE);
  57.                     Elemento p = cabecera;
  58.                     while(p!=null){
  59.                              nuevo.setColor(Color.RED);
  60.                              nuevo.fillRect(p.getX(), p.getY(), p.getA(), p.getH());
  61.                           p = p.siguiente;
  62.                     }
  63.                  
  64.             }
  65.  
  66.  
  67.        
  68.         }
La clase presentación agregue al menu la opcion de ver cordenadas.
queda así.
Código Java:
Ver original
  1. package listassimples2d_freddyalc;
  2. import java.awt.Color;
  3. import javax.swing.JFrame;
  4. import java.util.Scanner;
  5. public class Presentacion {
  6.     static Scanner leer = new Scanner(System.in);
  7.     static Lista  obj = new Lista();
  8.          
  9.  
  10.         public static int menu(){
  11.             int opc;
  12.             do{
  13.            System.out.println("---------------------- LISTAS MENU PRINCIPAL ----------------------");
  14.            System.out.println("Ingrese [1] uno para registrar un elemento");
  15.            System.out.println("Ingrese [2] para mostrar elementos.");
  16.            System.out.println("Ingrese [3] para mostrar cordenadas.");
  17.            System.out.println("Ingrese [4] para SALIR");
  18.            System.out.print("\n >> ");
  19.            opc = leer.nextInt();
  20.            
  21.             }while(opc<0 || opc>4);
  22.            return opc;
  23.         }
  24.        
  25.         public static void registrar(){
  26.            
  27.             int x, y, a, h;
  28.             x = 100;
  29.             y = 40;
  30.             a = 60;
  31.             h = 55;
  32.             obj.agregar_elemento(x, y, a, h);
  33.            
  34.            
  35.             System.out.println("Elemento agregado correctamente.");
  36.         }
  37.         public static void mostrar(){
  38.               JFrame marco = new JFrame("Listas representación Grafica");  
  39.               marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  40.              
  41.              
  42.               obj.setBackground(Color.WHITE);
  43.               marco.add(obj);
  44.               marco.setSize(1000, 500);
  45.               marco.setVisible(true);
  46. //            System.out.println(obj.mostrar_Elementos());
  47.         }
  48.    
  49.             public static void    mostrar_coordenadas(){
  50.                     obj.mostrar_Cordenadas();
  51.             }
  52.     public static void main(String[] args) {
  53.        
  54.            int opc;
  55.            do{
  56.                opc = menu();
  57.                
  58.                switch(opc){
  59.                    case 1:
  60.                        
  61.                        registrar();
  62.                        
  63.                        break;
  64.                        
  65.                    case 2:
  66.                        
  67.                        mostrar();
  68.                        break;
  69.                    case 3:
  70.                         mostrar_coordenadas();
  71.                        break;
  72.                        
  73.                    case 4:System.exit(0);
  74.                
  75.                }
  76.            
  77.            }while(opc!=4);
  78.        
  79.     }
  80. }
aquí dejo una captura.
http://i61.tinypic.com/2s98xgy.png


Solo me queda agradecerte chuidiang. Además de hacerme ver los errores lógicos que e tenido.
Voy agregar nuevas cosas funciona muy bien

Etiquetas: listas
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 03:19.