2016-07-14 8 views
1

Ich versuche, einige Beispiele für Tabelle mit Lazy Loading zu finden, um Informationen zu laden, nämlich Zeilen. Ich hatte einen guten Blick, aber ich kann nirgendwo ein gutes Beispiel finden (ich möchte kein Addon wie Viritin verwenden), ich möchte es einfach von Grund auf neu machen. Die Dokumentation auf der Vaadin-Website hilft nicht wirklich Table, also habe ich mich nur gefragt, ob irgendjemand ein gutes Tutorial kennt, das erklärt, was zu tun ist. Vielleicht wäre ein Beispiel dann besser. Also hier ist eine einfache Tabelle mit ganzen Zahlen bis zu 5000. Ich werde versuchen, Lazy Loading hier zu implementieren, was eine sehr einfache Anwendung ist und dann hoffentlich in der Lage sein werde, die Funktionalität einfach in meine eigene Anwendung zu integrieren. Hier ist der Code. Meine UI-Klasse (MyUI.java):Lazy Lade Tabelle in Vaadin

public class MyUI extends UI { 

    @Override 
    protected void init(VaadinRequest vaadinRequest) { 
     final VerticalLayout layout = new VerticalLayout(); 
     numberTable theTable = new numberTable(); 


     Button button = new Button("Click Me"); 
     button.addClickListener(new Button.ClickListener() 
     { 

      @Override 
      public void buttonClick(ClickEvent event) 
      { 
       System.out.println("test!"); 

      } 
     }); 

     layout.addComponents(button, theTable); 
     layout.setMargin(true); 
     layout.setSpacing(true); 

     setContent(layout); 
    } 

Und die Tabellenklasse (numberTable.java):

package my.vaadin.project.tableTest; 

import com.vaadin.ui.Table; 

public class numberTable extends Table 
{ 
    public numberTable(){ 
     /*addContainerProperty("Name", String.class, null); 
     addContainerProperty("Mag", Float.class, null); 
     addItem(new Object[]{"Canopus",  -0.72f}, 1); 
     addItem(new Object[]{"Arcturus",  -0.04f}, 2); 
     addItem(new Object[]{"Alpha Centauri", -0.01f}, 3);*/ 
     addContainerProperty("Number", Integer.class, null); 
     for(int i=1; i<=5000; i++){ 
      Integer itemID = new Integer(i); 
      addItem(new Object[]{i},itemID); 
     } 
     setCaption("Rendering table"); 
     addStyleName("testTable"); 
     setPageLength(size()); 
     System.out.println("table created"); 
    } 

} 

ich das gelesen habe die träges Laden Funktionalität zu implementieren Ich habe ein haben Container, der es unterstützt, außer dem Tisch, das ist mein Verständnis.

+0

Welche Art von Datenquelle haben Sie? Einige der Container in Vaadin unterstützen das Lazy Loading. –

+0

Hallo habe eine Tabelle (erstellt in einer Klasse, die Tabelle erweitert) – antobbo

+0

Eine Tabelle ist die Möglichkeit, Daten aus einem Container anzuzeigen. Wie bevölkern Sie den Tisch? https://vaadin.com/docs/-/part/framework/components/component-table.html. Die Tabelle ruft die Zeilen aus dem Container nach Bedarf –

Antwort

1

Gemäß der documentation entspricht die IndexedContainer Ihren Anforderungen. Oder wenn Sie selbst einen Container implementieren möchten, der das verzögerte Laden mit Table unterstützt, dann implementieren Sie die Container.Indexedinterface. Sie können den IndexedContainer Quellcode für ein Beispiel durchsuchen.

public class MyContainer implements Container.Indexed { 

    public Object nextItemId(Object itemId) { return ((Integer) itemId) + 1; } 
    public Object prevItemId(Object itemId) { return ((Integer) itemId) - 1; } 
    public Object firstItemId() { return 0; } 
    public Object lastItemId() { return 5000; } 
    public boolean isFirstId(Object itemId) { return Integer.valueOf(0).equals(itemId); } 
    public boolean isLastId(Object itemId) { return Integer.valueOf(5000).equals(itemId); } 

    public Item getItem(Object itemId) { 
     PropertysetItem item = new PropertysetItem(); 
     item.addItemProperty("index", new ObjectProperty<Integer>((Integer) itemId)); 
     return item; 
    } 
    public Collection<?> getContainerPropertyIds() { return Arrays.asList("index"); } 
    public Collection<?> getItemIds() { return Arrays.asList(IntStream.range(0, 5001).boxed().toArray(Integer[]::new)); } 
    public Property getContainerProperty(Object itemId, Object propertyId) { return new ObjectProperty<Integer>((Integer) itemId); } 
    public Class<?> getType(Object propertyId) { return Integer.class; } 
    public int size() { return 5001; } 
    public boolean containsId(Object itemId) { 
     Integer item = (Integer) itemId; 
     return item >= 0 && item <= 5000; 
    } 
    public int indexOfId(Object itemId) { return (Integer) itemId; } 
    public Object getIdByIndex(int index) { return index; } 
    public List<?> getItemIds(int startIndex, int numberOfItems) { return Arrays.asList(IntStream.range(0, 5001).boxed().toArray(Integer[]::new)).subList(startIndex, startIndex + numberOfItems); } 

    public Item addItem(Object itemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } 
    public Object addItem() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } 
    public boolean removeItem(Object itemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } 
    public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } 
    public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } 
    public boolean removeAllItems() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } 
    public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } 
    public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } 
    public Object addItemAt(int index) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } 
    public Item addItemAt(int index, Object newItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } 

} 

Es ist schreibgeschützt:

Ich habe für die Umsetzung der Container.Indexed Schnittstelle ein grundlegendes Beispiel gemacht. Artikel haben nur eine Eigenschaft "indexed" das ist der Index des Artikels zwischen 0 und 5000 einschließlich. Wie Sie sehen können, ist es eine Menge Arbeit, also sollten Sie nach Möglichkeit einen eingebauten Container benutzen.

+0

danke für den Code. Ich habe etwas ziemlich Interessantes bemerkt. In meinem eigenen Beispielcode. Ich zeige alle Elemente in der Tabelle an, also habe ich diese Zeile 'setPageLength (size());' in 'setPageLength (100);' geändert. Und siehe da, Lazy Loading funktioniert. Bedeutet das, dass Table lazy loading eingebaut hat? Die einzige Sache ist, dass, wenn ich das auf meine eigene Anwendung anwende (ich habe keine Integer in den Tabellenzeilen, sondern Objekte), faulen Laden funktioniert OK, wenn Sie nach unten scrollen, aber wenn Sie erneut scrollen, sind einige der Tabellenzeilen leer – antobbo

+0

Klingt seltsam, vielleicht ein Fehler, kann nicht ohne den Code sagen. –

+0

Nun, nein, ich meine wenn du darüber nachdenkst. Mit 'setPageLength (size());' sagst du im Wesentlichen, dass alle Zeilen angezeigt werden, so dass du nichts lazy laden kannst, da alles da ist, wherease mit 'setPageLength (100);' du hast nur 100 Zeilen angezeigt und die anderen werden über Lazy Loading geladen (sofern es aktiviert ist, wie es scheint). Der Code ist übrigens im Lieferumfang enthalten, da ich den Thread aktualisiert habe – antobbo