3 Replies Latest reply: Apr 2, 2013 9:21 AM by biochemistry43 RSS

    Strange behavior of TableView

    biochemistry43
      I have a problem with a TableView

      Then ... my code I try to populate a TableView
      .
      .
      .
      public class Panel_MarcadoresController implements Initializable {
      //FXML anotation
          @FXML TableView<Punto> tablaPuntos;
          @FXML TableColumn itemPuntoCol;
          @FXML TableColumn nomPuntoCol;
          @FXML TableColumn colorPuntoCol;
          @FXML TableColumn latPuntoCol;
          @FXML TableColumn lonPuntoCol;
      
          //ObservableList binding with tablaPuntos TableView
           ObservableList<Punto> datosPunto = FXCollections.observableArrayList();
      
         //Nested Class Punto
          public class Punto
          {
              private final SimpleIntegerProperty itemPunto = new SimpleIntegerProperty();
              private final SimpleStringProperty nombrePunto = new SimpleStringProperty("");
              private final SimpleStringProperty colorPunto = new SimpleStringProperty("");
              private final SimpleStringProperty latitudPunto = new SimpleStringProperty("");
              private final SimpleStringProperty longitudPunto = new SimpleStringProperty("");
              
              public Punto()
              {
                  this(0,"","","","");
              }
              
              public Punto(int id, String nombre, String color, String latitud, String longitud)
              {
                  this.setItem(id);
                  this.setNombre(nombre);
                  this.setColor(color);
                  this.setLatitud(latitud);
                  this.setLongitud(longitud);
              }
              
              public void setItem(int item)
              {
                  this.itemPunto.set(item);
              }
              public int getItem()
              {
                  return this.itemPunto.get();
              }
              public void setNombre(String nombre)
              {
                  this.nombrePunto.set(nombre);
              }
              public String getNombre()
              {
                  return this.nombrePunto.get();
              }
              public void setColor(String color)
              {
                  this.colorPunto.set(color);
              }
              public String getColor()
              {
                  return this.colorPunto.get();
              }
              public void setLatitud(String latitud)
              {
                  this.latitudPunto.set(latitud);
              }
              public String getLatitud()
              {
                  return this.latitudPunto.get();
              }
              public void setLongitud(String longitud)
              {
                  this.longitudPunto.set(longitud);
              }
              public String getLongitud()
              {
                  return this.longitudPunto.get();
              }
          }
         
         //With this method I read an XML file
         public void leerPuntosDesdeXML(String archivoXML)
          {
              //read XML
              JespXML archivoPlanSigna = new JespXML(archivoXML);
              
              try {
      
                  Tag xml = archivoPlanSigna.leerXML();
                  
                             
                  Tag tagMilitaryScenario = xml.getTagHijoByName("Military_Scenario");
                  Tag tagTacticalGraphics = tagMilitaryScenario.getTagHijoByName("Tactical_Graphics");
                  Tag tagFiguras = tagTacticalGraphics.getTagHijoByName("Figuras");
                  Tag tagPuntos = tagFiguras.getTagHijoByName("puntos");
                  
                   List<Tag> listaPuntos =  tagPuntos.getTagHijoByName("punto", Tag.Cantidad.TODOS_LOS_TAGS);
                   
                   for(Tag punto: listaPuntos)
                   {
                       Tag tagNombrePunto = punto.getTagHijoByName("nombre");
                       Tag tagIdPunto = punto.getTagHijoByName("id");
                       Tag tagColorPunto = punto.getTagHijoByName("color");
                       Tag tagCoordenadaPunto = punto.getTagHijoByName("coordenada");
                       Tag tagLatitudPunto = tagCoordenadaPunto.getTagHijoByName("latitud");
                       Tag tagLongitudPunto = tagCoordenadaPunto.getTagHijoByName("longitud");
                       
                       int idPunto = Integer.parseInt(tagIdPunto.getContenido());
                       String nomPunto = tagNombrePunto.getContenido();
                       String colorPunto = tagColorPunto.getContenido();
                       String latitudPunto = tagLatitudPunto.getContenido();
                       String longitudPunto = tagLongitudPunto.getContenido();
                       
                       //yes... values are printed
                       System.out.println("El id del punto es: "+idPunto);
                       System.out.println("El nombre del punto es: "+nomPunto);
                       System.out.println("El color del punto es: "+colorPunto);
                       System.out.println("La latitud del punto es: "+latitudPunto);
                       System.out.println("la Longitud del punto es: "+longitudPunto);
                      
                       Punto puntos = new Punto(idPunto, nomPunto, colorPunto, latitudPunto, longitudPunto);
                       
                       //add object Puntos to ObservableList datosPunto
                       datosPunto.add(puntos);
             
                        //add ObsevableList datosPunto to tablaPunto TableView
                       tablaPuntos.setItems(datosPunto);
                   }
                  
              }catch ( TagHijoNotFoundException | ParserConfigurationException | SAXException | IOException ex) {
                  Logger.getLogger(Panel_MarcadoresController.class.getName()).log(Level.SEVERE, null, ex);
              }
          } 
      This my FXML code:
      <TableView fx:id="tablaPuntos" layoutX="14.0" layoutY="46.0" prefHeight="190.0" prefWidth="257.0">
          <columns>
              <TableColumn editable="false" prefWidth="65.0" text="id" fx:id="itemPuntoCol">
                  <cellValueFactory>
                      <PropertyValueFactory property="itemPunto" />
                  </cellValueFactory>
              </TableColumn>
              <TableColumn prefWidth="130.0" text="Nombre" fx:id="nomPuntoCol">
                  <cellValueFactory>
                      <PropertyValueFactory property="nombrePunto" />
                  </cellValueFactory>
              </TableColumn>
              <TableColumn prefWidth="65.0" text="Color" fx:id="colorPuntoCol">
                  <cellValueFactory>
                      <PropertyValueFactory property="colorPunto" />
                  </cellValueFactory>
              </TableColumn>
              <TableColumn prefWidth="85.0" text="Latitud" fx:id="latPuntoCol">
                  <cellValueFactory>
                      <PropertyValueFactory property="latitudPunto" />
                  </cellValueFactory>
              </TableColumn>
              <TableColumn prefWidth="85.0" text="Longitud" fx:id="lonPuntoCol">
                  <cellValueFactory>
                      <PropertyValueFactory property="longitudPunto" />
                  </cellValueFactory>
              </TableColumn>
          </columns>
      </TableView>
      When I call the method, the table seems to be busy but not seeing any data and it.

      I do not understand ... I have another table implemented in exactly the same way and it works.

      Sorry for the bad English

      Thanks in advance
        • 1. Re: Strange behavior of TableView
          shakir.gusaroff
          Hi. I think
                 tablaPuntos.setItems(datosPunto);
          
             
          should not be a part of the for loop. I would do like this:
            for(Tag punto: listaPuntos)
                       {
                           Tag tagNombrePunto = punto.getTagHijoByName("nombre");
                           Tag tagIdPunto = punto.getTagHijoByName("id");
                           Tag tagColorPunto = punto.getTagHijoByName("color");
                           Tag tagCoordenadaPunto = punto.getTagHijoByName("coordenada");
                           Tag tagLatitudPunto = tagCoordenadaPunto.getTagHijoByName("latitud");
                           Tag tagLongitudPunto = tagCoordenadaPunto.getTagHijoByName("longitud");
                           
                           int idPunto = Integer.parseInt(tagIdPunto.getContenido());
                           String nomPunto = tagNombrePunto.getContenido();
                           String colorPunto = tagColorPunto.getContenido();
                           String latitudPunto = tagLatitudPunto.getContenido();
                           String longitudPunto = tagLongitudPunto.getContenido();
                           
                           //yes... values are printed
                           System.out.println("El id del punto es: "+idPunto);
                           System.out.println("El nombre del punto es: "+nomPunto);
                           System.out.println("El color del punto es: "+colorPunto);
                           System.out.println("La latitud del punto es: "+latitudPunto);
                           System.out.println("la Longitud del punto es: "+longitudPunto);
                          
                           Punto puntos = new Punto(idPunto, nomPunto, colorPunto, latitudPunto, longitudPunto);
                           
                           //add object Puntos to ObservableList datosPunto
                           datosPunto.add(puntos);
                 
                            //add ObsevableList datosPunto to tablaPunto TableView
                         //  tablaPuntos.setItems(datosPunto);   //removed 
                       }
                       tablaPuntos.setItems(datosPunto);    //added
          
          
           
          • 2. Re: Strange behavior of TableView
            James_D
            I would make Shakir's change (just because it's better), but it won't fix the problem.

            The problem is that your property names don't match the attributes you're passing to the PropertyValueFactory. For example, you have methods getItem() and setItem(...), which define a (Java bean) property called "item". Thus you need
            <PropertyValueFactory property="item" />
            You probably want to let the PropertyValueFactory see the observable JavaFX properties, too. So you should add a method
            public IntegerProperty itemProperty() {
              return itemPunto ;
            }
            in your Punto class.
            And then similar changes to these for all the other properties.
            • 3. Re: Strange behavior of TableView
              biochemistry43
              I had no idea it would be so specific in the getters and setters.

              It worked perfectly.

              thank you very much