comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[SOLUCIONADO] JTable Agregando filas dentro del for no funciona

  • 3 Respuestas
  • 1131 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado 2Fac3R

  • *
  • Underc0der
  • Mensajes: 235
  • Actividad:
    5%
  • Reputación 0
  • Why be a king, when you can be a god
    • Ver Perfil
    • Escuela de Hackers & Programación
  • Skype: rockeg_18
  • Twitter: @2Fac3R
« en: Mayo 13, 2015, 08:38:47 pm »
Buenas!  8)

Resulta que tengo que hacer una tabla con valores que tomo de una matriz de adyacencia la cual está en un archivo de textos, todo eso bien, pero cuando trato de ingresar los valores dentro del for (para ir recorriendo todos) no me funciona, pero afuera sí!  :o

Código: Java
  1. package practica4;
  2.  
  3. import javax.swing.*;
  4. import javax.swing.table.DefaultTableModel;
  5.  
  6. import java.awt.*;
  7. import java.awt.event.*;
  8. import java.util.ArrayList;
  9.  
  10. import practica4.Archivo;
  11.  
  12. public class Table extends You are not allowed to view links. Register or Login {
  13.        
  14.         public Table() {
  15.                 Archivo file = new Archivo();
  16.                 file.Leer3();
  17.                
  18.                 You are not allowed to view links. Register or Login[][] datos = null;
  19.                         You are not allowed to view links. Register or Login[] columnNames = {"Origen","Destino","Peso"};
  20.                         You are not allowed to view links. Register or Login dtm= new You are not allowed to view links. Register or Login(datos,columnNames);
  21.                         final You are not allowed to view links. Register or Login table = new You are not allowed to view links. Register or Login(dtm);
  22.                        
  23.                         ArrayList<String> ciudades = file.getCitiesMatriz();
  24.                         ArrayList<String> pesos = file.getPesos();
  25.                         /*Object[] newRow={"a","b","c"};
  26.                         dtm.addRow(newRow);*/
  27.                        
  28.                         for(int j=0, k=0; j<=ciudades.size() ; j++)
  29.                         {
  30.                                 for(int i=0; i<ciudades.size(); i++,k++)
  31.                                 {
  32.                                         if(ciudades.get(j).equals(ciudades.get(i)))
  33.                                         {
  34.                                                 continue;
  35.                                         }
  36.                                         You are not allowed to view links. Register or Login[] newRow={"a","b","c"};
  37.                                         dtm.addRow(newRow);
  38.                                        
  39.                                         // Agregar nueva fila
  40.                                         /*Object[] newRow={ciudades.get(j),ciudades.get(i),pesos.get(k)};
  41.                                         dtm.addRow(newRow);*/
  42.                                          
  43.                                         //System.out.println(ciudades.get(j) + " - " + ciudades.get(i) + "- " + pesos.get(k));
  44.                                        
  45.                                                
  46.                                 }
  47.                                
  48.                         }
  49.                         table.setPreferredScrollableViewportSize(new You are not allowed to view links. Register or Login(250, 100));
  50.                         You are not allowed to view links. Register or Login scrollPane = new You are not allowed to view links. Register or Login(table);
  51.                         getContentPane().add(scrollPane, You are not allowed to view links. Register or Login.CENTER);
  52.                        
  53.                         addWindowListener(new You are not allowed to view links. Register or Login() {
  54.                        
  55.                                 public void windowClosing(You are not allowed to view links. Register or Login e){You are not allowed to view links. Register or Login.exit(0);}
  56.                         });
  57.                 }
  58.                 public static void main(You are not allowed to view links. Register or Login[] args) {
  59.                         Table frame = new Table();
  60.                         frame.pack();
  61.                         frame.setVisible(true);
  62.         }
  63. }

Hice la parte:
Código: Java
  1. You are not allowed to view links. Register or Login[] newRow={"a","b","c"};
  2.                                         dtm.addRow(newRow);

Para pruebas, pero la parte que realmente ocupo es:
Código: Java
  1. You are not allowed to view links. Register or Login[] newRow={ciudades.get(j),ciudades.get(i),pesos.get(k)};
  2.                                         dtm.addRow(newRow);

Si saco esa parte afuera del for si me funciona, por ejemplo:
Código: Java
  1. You are not allowed to view links. Register or Login[] newRow={"a","b","c"};
  2.                         dtm.addRow(newRow);
  3.                        
  4.                         /*for(int j=0, k=0; j<=ciudades.size() ; j++)
  5.                         {
  6.                                 for(int i=0; i<ciudades.size(); i++,k++)
  7.                                 {
  8.                                         if(ciudades.get(j).equals(ciudades.get(i)))
  9.                                         {
  10.                                                 continue;
  11.                                         }
  12.                                         Object[] newRow={"a","b","c"};
  13.                                         dtm.addRow(newRow);
  14.                                        
  15.                                         // Agregar nueva fila
  16.                                         /*Object[] newRow={ciudades.get(j),ciudades.get(i),pesos.get(k)};
  17.                                         dtm.addRow(newRow);
  18.                                          
  19.                                         //System.out.println(ciudades.get(j) + " - " + ciudades.get(i) + "- " + pesos.get(k));
  20.                                        
  21.                                                
  22.                                 }
  23.                                
  24.                         }*/
  25.  

El error es el siguiente:
Citar
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
   at java.util.ArrayList.rangeCheck(Unknown Source)
   at java.util.ArrayList.get(Unknown Source)
   at practica4.Table.<init>(Table.java:32)
   at practica4.Table.main(Table.java:59)

Archivo txt:
Citar
ALEMANIA BELGICA CANADA FRANCIA HOLANDA INGLATERRA
0    5    7    0    6    0   
2    0    0    4    0    3
0    1    6    0    9    7
4    8    0    5    0    0
11    9    0    0    3    2
3    0    8    9    0    0

Método Leer3() de la clase Archivo
Código: Java
  1. public void Leer3()
  2.         {      
  3.                 try
  4.                 {
  5.                         You are not allowed to view links. Register or Login chooser = new You are not allowed to view links. Register or Login();
  6.                         chooser.showOpenDialog(chooser);
  7.                         You are not allowed to view links. Register or Login fileXML = chooser.getSelectedFile();
  8.                         You are not allowed to view links. Register or Login path = fileXML.getAbsolutePath();
  9.                         You are not allowed to view links. Register or Login linea;
  10.                        
  11.                         You are not allowed to view links. Register or Login archivo = new You are not allowed to view links. Register or Login(path);
  12.                         Scanner sc = new Scanner(archivo);
  13.                         cities_matriz = new ArrayList<String>();
  14.                         pesos = new ArrayList<String>();
  15.                        
  16.                         linea = sc.nextLine();
  17.                         You are not allowed to view links. Register or Login st0 = new You are not allowed to view links. Register or Login(linea," ");
  18.                        
  19.                         while(st0.hasMoreTokens())
  20.                         {
  21.                                 cities_matriz.add(st0.nextToken());
  22.                                
  23.                         }
  24.                        
  25.                        
  26.                        
  27.                         while(sc.hasNextLine()) {
  28.                                 You are not allowed to view links. Register or Login st = new You are not allowed to view links. Register or Login(sc.nextLine(),"    ");
  29.                                
  30.                                 while(st.hasMoreTokens())
  31.                                 {
  32.                                         pesos.add(st.nextToken());
  33.                                        
  34.                                 }
  35.                 }
  36.                         sc.close();
  37.                 }
  38.                 catch(You are not allowed to view links. Register or Login fnfe){
  39.                         You are not allowed to view links. Register or Login.showMessageDialog(null, "Archivo no seleccionado!.");
  40.                 }
  41.                
  42.         }

Alguien sabe cuál es el problema? Porqué afuera del for si se crea la tabla y dentro no?

Zalu2!
« Última modificación: Mayo 14, 2015, 04:49:21 pm por blackdrake »
Escuela de Hackers & Programación.
You are not allowed to view links. Register or Login

Desconectado Gus Garsaky

  • *
  • Underc0der
  • Mensajes: 93
  • Actividad:
    0%
  • Reputación -1
    • Ver Perfil
  • Skype: gus.garsaky
« Respuesta #1 en: Mayo 13, 2015, 11:35:26 pm »
Hola,

Primero dos cosas:

  • Haz tu código lógico, es decir, ese for es una mezcla de variables que generan confusión para el lector.
  • Interpreta las excepciones.

El lugar de anidar dos for para ver si la ciudad ya existe, crea un método que haga ello e itera el List con un foreach simple:

Código: Java
  1. for(You are not allowed to view links. Register or Login ciudad : ciudades) {
  2.         if(checkIfExists(ciudad)) {
  3.                 continue;
  4.         } else {
  5.                 You are not allowed to view links. Register or Login[] rowToAdd = {"a", "b", "c", "d"};
  6.                 dm.addRow(rowToAdd);
  7.         }
  8. }
  9.  
  10. /**
  11.  * Compara si un valor existe actualmente en la tabla
  12.  * @param city ciudad a evaluar si existe
  13.  * @return true si existe, false de lo contrario
  14.  */
  15. private boolean checkIfExists(You are not allowed to view links. Register or Login city) {
  16.         boolean exists;
  17.         for(int row=0; row<dm.getRowCount(); row++) {
  18.                 for(int col=0; col<dm.getColumnCount(); col++) {
  19.                         You are not allowed to view links. Register or Login currentCity = dm.getValueAt(row, col);
  20.                         exists = currentCity.equals(city);
  21.                 }
  22.         }
  23.         return exists;
  24. }

Ahora, si analizamos la excepción, veremos que dice:

Citar
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6

La excepción java.lang.IndexOutOfBoundsException se lanza cuando se está tratando de acceder a un índice que excede el tamaño de la lista, por lo que, como dicho índice no existe, la VM lanza dicha excepción en tiempo de ejecución.

Ésto, se puede deducir en tu código por que iteras desde 0 hasta N, cuando es  desde 0 hasta N-1:

Código: Java
  1. for(int j=0, k=0; j<=ciudades.size() ; j++) { /*...*/ }

El rastreo de pila te indica en qué líneas están tu error. En tu caso dice que el error lógico está en las líneas 32 y 59 (posible redundancia) en la clase Table. Revisa y comentas cómo te fue.

Desconectado 2Fac3R

  • *
  • Underc0der
  • Mensajes: 235
  • Actividad:
    5%
  • Reputación 0
  • Why be a king, when you can be a god
    • Ver Perfil
    • Escuela de Hackers & Programación
  • Skype: rockeg_18
  • Twitter: @2Fac3R
« Respuesta #2 en: Mayo 14, 2015, 11:19:38 am »
Vaya que se me ha ido el tema del n-1  ::)

En el for no veo donde esté la confusión, simplemente es un for anidado dentro de otro lo cual hace que recorra la lista de ciudades mientras el otro sigue en el mismo, lo cual me permite tomar el valor de ciudades de j para todas las ciudades (donde uso i).

Pienso que no es necesario crear otro método para verificar que la ciudades sean iguales, ya que en 1 linea se puede hacer, pero lo tendré en cuenta.

Se ha solucionado el problema debido a lo que mencionabas del índice, ha quedado así:
Código: Java
  1. for(int j=0, k=0; j<ciudades.size() ; j++)
  2.                         {
  3.                                 for(int i=0; i<ciudades.size(); i++,k++)
  4.                                 {
  5.                                         if(ciudades.get(j).equals(ciudades.get(i)))
  6.                                         {
  7.                                                 continue;
  8.                                         }
  9.                                        
  10.                                        
  11.                                         // Agregar nueva fila
  12.                                         You are not allowed to view links. Register or Login[] newRow={ciudades.get(j),ciudades.get(i),pesos.get(k)};
  13.                                         dtm.addRow(newRow);
  14.                                          
  15.                                         //System.out.println(ciudades.get(j) + " - " + ciudades.get(i) + "- " + pesos.get(k));
  16.                                        
  17.                                                
  18.                                 }
  19.                                
  20.                         }


Gracias por la ayuda!  ;D
Zalu2
Escuela de Hackers & Programación.
You are not allowed to view links. Register or Login

Desconectado Gus Garsaky

  • *
  • Underc0der
  • Mensajes: 93
  • Actividad:
    0%
  • Reputación -1
    • Ver Perfil
  • Skype: gus.garsaky
« Respuesta #3 en: Mayo 14, 2015, 12:47:29 pm »
Siempre que crees algún código, hazlo lo más limpio y modular posible. Es muy posible que ahora no le veas sentido, pero cuando hagas cosas complejas, si no sigues los principales principios de desarrollo, como DRY, SRP y facilitando el unit testing y otras cosas más importantes en el desarrollo, realmente tu aplicación será pobre desde el punto de vista de escalabilidad y llegará un punto en que se haga inmantenible y tengas que dar la aplicación por muerta, y será una pérdida grande económicamente.

Esos for pueden estructurarse mejor, de manera más limpia. Recuerda que en el mundo real, muchas personas van a ver tu código y éste deberá tener la suficiente calidad como para que lo puedan entender y mantener.

Me alegra que se haya resuelto tu duda. Un saludo.
« Última modificación: Mayo 14, 2015, 12:52:15 pm por Gus Garsaky »

 

¿Te gustó el post? COMPARTILO!



[SOLUCIONADO] ¿Kali Linux o Kali Linux Ligth ?

Iniciado por worq

Respuestas: 2
Vistas: 5204
Último mensaje Noviembre 21, 2017, 12:28:54 pm
por Codig0Bit
[SOLUCIONADO] Multiuploader de imagenes con mysql, hosting de imagenes con mysql

Iniciado por graphixx

Respuestas: 4
Vistas: 1995
Último mensaje Marzo 26, 2013, 05:42:58 pm
por Xt3mP
[SOLUCIONADO] ¿Como publicar un software como software libre?

Iniciado por FuriosoJack

Respuestas: 2
Vistas: 1443
Último mensaje Mayo 23, 2017, 07:24:22 am
por HATI
[SOLUCIONADO] Linux Mint, errores, errores y mas errores...

Iniciado por n1sendev

Respuestas: 12
Vistas: 2448
Último mensaje Noviembre 22, 2017, 06:50:55 am
por RuidosoBSD
[SOLUCIONADO] Problem al instalar Windows "cualquier windows"

Iniciado por Made

Respuestas: 7
Vistas: 2806
Último mensaje Septiembre 03, 2012, 04:53:08 pm
por Made