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
  • 1182 Vistas

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

Desconectado 2Fac3R

  • *
  • Underc0der
  • Mensajes: 237
  • Actividad:
    3.33%
  • 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 No tienes permisos para ver links. Registrate o Entra con tu cuenta {
  13.        
  14.         public Table() {
  15.                 Archivo file = new Archivo();
  16.                 file.Leer3();
  17.                
  18.                 No tienes permisos para ver links. Registrate o Entra con tu cuenta[][] datos = null;
  19.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta[] columnNames = {"Origen","Destino","Peso"};
  20.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta dtm= new No tienes permisos para ver links. Registrate o Entra con tu cuenta(datos,columnNames);
  21.                         final No tienes permisos para ver links. Registrate o Entra con tu cuenta table = new No tienes permisos para ver links. Registrate o Entra con tu cuenta(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.                                         No tienes permisos para ver links. Registrate o Entra con tu cuenta[] 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 No tienes permisos para ver links. Registrate o Entra con tu cuenta(250, 100));
  50.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta scrollPane = new No tienes permisos para ver links. Registrate o Entra con tu cuenta(table);
  51.                         getContentPane().add(scrollPane, No tienes permisos para ver links. Registrate o Entra con tu cuenta.CENTER);
  52.                        
  53.                         addWindowListener(new No tienes permisos para ver links. Registrate o Entra con tu cuenta() {
  54.                        
  55.                                 public void windowClosing(No tienes permisos para ver links. Registrate o Entra con tu cuenta e){No tienes permisos para ver links. Registrate o Entra con tu cuenta.exit(0);}
  56.                         });
  57.                 }
  58.                 public static void main(No tienes permisos para ver links. Registrate o Entra con tu cuenta[] args) {
  59.                         Table frame = new Table();
  60.                         frame.pack();
  61.                         frame.setVisible(true);
  62.         }
  63. }

Hice la parte:
Código: Java
  1. No tienes permisos para ver links. Registrate o Entra con tu cuenta[] newRow={"a","b","c"};
  2.                                         dtm.addRow(newRow);

Para pruebas, pero la parte que realmente ocupo es:
Código: Java
  1. No tienes permisos para ver links. Registrate o Entra con tu cuenta[] 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. No tienes permisos para ver links. Registrate o Entra con tu cuenta[] 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.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta chooser = new No tienes permisos para ver links. Registrate o Entra con tu cuenta();
  6.                         chooser.showOpenDialog(chooser);
  7.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta fileXML = chooser.getSelectedFile();
  8.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta path = fileXML.getAbsolutePath();
  9.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta linea;
  10.                        
  11.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta archivo = new No tienes permisos para ver links. Registrate o Entra con tu cuenta(path);
  12.                         Scanner sc = new Scanner(archivo);
  13.                         cities_matriz = new ArrayList<String>();
  14.                         pesos = new ArrayList<String>();
  15.                        
  16.                         linea = sc.nextLine();
  17.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta st0 = new No tienes permisos para ver links. Registrate o Entra con tu cuenta(linea," ");
  18.                        
  19.                         while(st0.hasMoreTokens())
  20.                         {
  21.                                 cities_matriz.add(st0.nextToken());
  22.                                
  23.                         }
  24.                        
  25.                        
  26.                        
  27.                         while(sc.hasNextLine()) {
  28.                                 No tienes permisos para ver links. Registrate o Entra con tu cuenta st = new No tienes permisos para ver links. Registrate o Entra con tu cuenta(sc.nextLine(),"    ");
  29.                                
  30.                                 while(st.hasMoreTokens())
  31.                                 {
  32.                                         pesos.add(st.nextToken());
  33.                                        
  34.                                 }
  35.                 }
  36.                         sc.close();
  37.                 }
  38.                 catch(No tienes permisos para ver links. Registrate o Entra con tu cuenta fnfe){
  39.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta.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.
No tienes permisos para ver links. Registrate o Entra con tu cuenta

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(No tienes permisos para ver links. Registrate o Entra con tu cuenta ciudad : ciudades) {
  2.         if(checkIfExists(ciudad)) {
  3.                 continue;
  4.         } else {
  5.                 No tienes permisos para ver links. Registrate o Entra con tu cuenta[] 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(No tienes permisos para ver links. Registrate o Entra con tu cuenta city) {
  16.         boolean exists;
  17.         for(int row=0; row<dm.getRowCount(); row++) {
  18.                 for(int col=0; col<dm.getColumnCount(); col++) {
  19.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta 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: 237
  • Actividad:
    3.33%
  • 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.                                         No tienes permisos para ver links. Registrate o Entra con tu cuenta[] 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.
No tienes permisos para ver links. Registrate o Entra con tu cuenta

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: 7046
Último mensaje Noviembre 21, 2017, 12:28:54 pm
por Codig0Bit
[SOLUCIONADO] ¿Como publicar un software como software libre?

Iniciado por FuriosoJack

Respuestas: 2
Vistas: 1592
Último mensaje Mayo 23, 2017, 07:24:22 am
por HATI
[SOLUCIONADO] Multiuploader de imagenes con mysql, hosting de imagenes con mysql

Iniciado por graphixx

Respuestas: 4
Vistas: 2187
Último mensaje Marzo 26, 2013, 05:42:58 pm
por Xt3mP
[SOLUCIONADO] Linux Mint, errores, errores y mas errores...

Iniciado por n1sendev

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

Iniciado por Made

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