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

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

Conectado 2Fac3R

  • *
  • Underc0der
  • Mensajes: 238
  • Actividad:
    1.67%
  • 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 JFrame {
  13.        
  14.         public Table() {
  15.                 Archivo file = new Archivo();
  16.                 file.Leer3();
  17.                
  18.                 Object[][] datos = null;
  19.                         String[] columnNames = {"Origen","Destino","Peso"};
  20.                         DefaultTableModel dtm= new DefaultTableModel(datos,columnNames);
  21.                         final JTable table = new JTable(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.                                         Object[] 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 Dimension(250, 100));
  50.                         JScrollPane scrollPane = new JScrollPane(table);
  51.                         getContentPane().add(scrollPane, BorderLayout.CENTER);
  52.                        
  53.                         addWindowListener(new WindowAdapter() {
  54.                        
  55.                                 public void windowClosing(WindowEvent e){System.exit(0);}
  56.                         });
  57.                 }
  58.                 public static void main(String[] args) {
  59.                         Table frame = new Table();
  60.                         frame.pack();
  61.                         frame.setVisible(true);
  62.         }
  63. }

Hice la parte:
Código: Java
  1. Object[] newRow={"a","b","c"};
  2.                                         dtm.addRow(newRow);

Para pruebas, pero la parte que realmente ocupo es:
Código: Java
  1. Object[] 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. Object[] 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.                         JFileChooser chooser = new JFileChooser();
  6.                         chooser.showOpenDialog(chooser);
  7.                         File fileXML = chooser.getSelectedFile();
  8.                         String path = fileXML.getAbsolutePath();
  9.                         String linea;
  10.                        
  11.                         FileInputStream archivo = new FileInputStream(path);
  12.                         Scanner sc = new Scanner(archivo);
  13.                         cities_matriz = new ArrayList<String>();
  14.                         pesos = new ArrayList<String>();
  15.                        
  16.                         linea = sc.nextLine();
  17.                         StringTokenizer st0 = new StringTokenizer(linea," ");
  18.                        
  19.                         while(st0.hasMoreTokens())
  20.                         {
  21.                                 cities_matriz.add(st0.nextToken());
  22.                                
  23.                         }
  24.                        
  25.                        
  26.                        
  27.                         while(sc.hasNextLine()) {
  28.                                 StringTokenizer st = new StringTokenizer(sc.nextLine(),"    ");
  29.                                
  30.                                 while(st.hasMoreTokens())
  31.                                 {
  32.                                         pesos.add(st.nextToken());
  33.                                        
  34.                                 }
  35.                 }
  36.                         sc.close();
  37.                 }
  38.                 catch(Exception fnfe){
  39.                         JOptionPane.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.
http://ihackndev.blogspot.com/

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(String ciudad : ciudades) {
  2.         if(checkIfExists(ciudad)) {
  3.                 continue;
  4.         } else {
  5.                 Object[] 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(String city) {
  16.         boolean exists;
  17.         for(int row=0; row<dm.getRowCount(); row++) {
  18.                 for(int col=0; col<dm.getColumnCount(); col++) {
  19.                         String 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.

Conectado 2Fac3R

  • *
  • Underc0der
  • Mensajes: 238
  • Actividad:
    1.67%
  • 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.                                         Object[] 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.
http://ihackndev.blogspot.com/

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: 8442
Ú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: 1718
Ú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: 2305
Ú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: 3212
Último mensaje Noviembre 22, 2017, 06:50:55 am
por RuidosoBSD
[SOLUCIONADO] Problem al instalar Windows "cualquier windows"

Iniciado por Made

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