2017-01-05 10 views
1

Ich habe eine Vaadin-Tabelle und möchte Zeilen dynamisch hinzufügen darin.Mehrere Tabellenzeilen dynamisch hinzufügen

Der Code, den ich ausprobiert habe, funktioniert gut und wenn ich auf die Schaltfläche Zeile hinzufügen klicke, erscheint eine neue Zeile in der Tabelle. Das Problem ist, dass, wenn ich auf die Schaltfläche für die zweite, dritte usw. Zeit klicke, keine neue Zeile in der Tabelle erscheint. Ich möchte so viele Zeilen hinzufügen, wie auf die Schaltfläche geklickt wird. Wie kann ich es finden?

Unten finden Sie den Code ein, wo die Tabelle erstellt wird:

public Table createTable(BeanContainer beans) { 

    table.setContainerDataSource(beans); 
    table.setColumnHeader("PS_SECTION", "ID"); 
    table.setColumnHeader("NAME", "SECTION"); 
    table.setColumnHeader("VORDER","ORDER"); 

    table.addGeneratedColumn("ACTIVE", new Table.ColumnGenerator() { 

     private static final long serialVersionUID = 1L; 
     @Override 
     public Object generateCell(final Table source, final Object itemId, 
       Object columnId) { 

      final CheckBox checkBox = new CheckBox(""); 
      Set<Object> keys = itemIdToCheckbox.keySet(); 

       for (Object key : keys) {      
         PS_SECTION PS = (PS_SECTION) sectionMap.get(key); 

         if (PS.getISACTIVE() == 1) { 
          CheckIt(key,true);        
         } 
         else if(PS.getISACTIVE() == 0){ 
          CheckIt(key,false);       
         }        
       } 

      checkBox.addAttachListener(new AttachListener() { 
       @Override 
       public void attach(AttachEvent event) { 
        itemIdToCheckbox.put(itemId, checkBox); 
        tableToCheck.put(itemId, checkBox);               
       } 
      }); 

      checkBox.addDetachListener(new DetachListener() { 
       @Override 
       public void detach(DetachEvent event) { 
        itemIdToCheckbox.remove(itemId); 
        tableToCheck.remove(itemId); 
       } 
      }); 

      checkBox.addValueChangeListener(new Property.ValueChangeListener() {      
       @Override 
       public void valueChange(Property.ValueChangeEvent event) {      
        Boolean selected = (Boolean) event.getProperty().getValue();                   
       } 
      }); 

      return checkBox;     
     }    
    }); 

    table.setMultiSelect(false); 
    table.setVisibleColumns(new Object[]{"PS_SECTION", "NAME", "VORDER", "ACTIVE"}); 
    table.setEditable(true); 
    table.setSelectable(true); 
    table.setImmediate(true); 
    table.commit(); 
    return table; 
} 

Und hier wird der Container Code:

public BeanContainer createContainer() {     
     beans.setBeanIdProperty("PS_SECTION"); 
     for (int i = 0; i < list.size(); i++) { 
      PS_SECTION section = list.get(i); 

       Long ps = section.getPS_SECTION(); 
       String na = section.getNAME(); 
       Long is = section.getISACTIVE(); 
       Long isg = section.getISGLOBAL(); 
       Long or = section.getVORDER(); 
       Integer st = section.getSTATUS(); 

      beanlist.add(new PS_SECTION(ps, na, is, isg, or, st));  
     }   
     beans.addAll(beanlist); 
    return beans; 
} 

Schließlich ist die Zeile hinzufügen Button-Code:

addButton.addClickListener(new ClickListener() {    
     @Override 
     public void buttonClick(ClickEvent event) {          
       Object newbean = beans.addBean(new PS_SECTION(0L, null, 0L, 0L, 0L, 0)); 
       table.addItem(newbean); 
     } 
    }); 

Versuchen Sie auch Folgendes, um Duplikate zu vermeiden. Gleiche passierte

    long in = 200; 
        Object newbean = beans.addBean(new PS_SECTION(in, null, 0L, 0L, 0L, 0));  
        ++in; 
        table.addItem(newbean); 
+0

Wie lautet die Kennung des newBean? Wahrscheinlich hast Du Duplikate ...) –

+0

@ AndréSchild Der Bezeichner ist der erste lange von den Beans. Ich habe meine Frage jetzt entsprechend deinem Kommentar bearbeitet. Das Gleiche ist passiert. Was denkst du soll ich tun? – natso

+0

Versuchen Sie, die Tabelle aufzurufen. RefreshRowCache(); Methode, nachdem Sie Ihre Artikel hinzugefügt haben. –

Antwort

1

diese Linie halten: long in = 200; außerhalb des clicklistener Code Schaltfläche Hinzufügen. Vielleicht können Sie es global (Klasse) Mitglied machen;

+0

Es war sicher hilfreich, die Zeile außerhalb der Schaltfläche zum Hinzufügen zu behalten. Vielen Dank! – natso

Verwandte Themen