2011-11-21 10 views
5

Jak mogę automatycznie przewinąć GWT SuggestBox z ustawieniem maks. Wysokości na PopupPanel trzymając SuggestBox? Obecnie, gdy użytkownik naciśnie klawisze klawisza w górę i klawisze w dół, zmienia style na sugerowanych elementach, a naciśnięcie klawisza enter spowoduje wybranie aktualnie wybranego elementu z listy.Jak automatycznie przewijać GWT SuggestBox z maksymalną wysokością i przepełnieniem-y: przewijać

Gdy przedmiot znajduje się poniżej pasków przewijania maks., Nie przewija się. Próbowałem rozszerzyć SuggestBox i wewnętrzną klasę DefaultSuggestionDisplay, aby zastąpić moveSelectionDown() i moveSelectionUp(), aby jawnie wywołać popup.setScrollTop().

W tym celu muszę dostęp do absolutnego szczytu aktualnie wybranego MenuItem zatem potrzebuje dostępu do SuggestionMenu który jest również wewnętrzna klasa SuggestBox które są prywatne i zadeklarowane jako prywatny członka w DefaultSuggestionDisplay bez getter. Ponieważ GWT jest JavaScriptem, nie możemy użyć odbicia, aby uzyskać do niego dostęp ... Czy ktoś ma obejście tego problemu?

Dzięki.

+0

jestem nie jestem pewien, dostaję to, co mówisz. Być może musisz pokazać kod lub skrzypce, aby wyjaśnić problem. –

+1

Właśnie zrobiłem dokładnie to samo – l3dx

+0

Czy w końcu znalazłeś jakiś sposób, aby to osiągnąć? Utknąłem w tym samym miejscu, co Ty, potrzebuję dostępu do aktualnie wybranego MenuItem, aby przewinąć je do widoku. Dzięki. –

Odpowiedz

0

OK, w końcu znalazłem rozwiązanie. Musiałem stworzyć własne pole sugestii oparte na implementacjach GWT SuggestBox. Ale śledzić poniżej w niestandardowym implementaion: -Miejsce ScrollPanel do PopupPanel następnie umieścić pasek menu do ScrollPanel -W moveSelectionUp() i() moveSelectionDown swojego nowego wdrożenia wewnętrznego SuggestionDisplat dodać poniższy kod:

panel.ensureVisible(menu.getSelectedItem()); 

To nie jest osiągalny przez rozszerzenie SuggestBox, ponieważ nie będziemy mieć dostępu do wybranej pozycji menuItem , chyba że nadpisujemy zabezpieczoną metodę getSelectionItem() jako metodę publiczną.

koniec dodać CSS:

max-height: 250px; 

Do tej popupPanel w swoich implementacjach wyświetlania.

+0

Zobacz drugą odpowiedź od Perdiego Estaquela, która nie wymaga hakowania w serwisie SuggestBox, ale zamiast tego używa prostego rozszerzenia. – cellepo

2

Szukałem w pobliżu i nie mogłem znaleźć odpowiedniego rozwiązania (oprócz ponownego zaimplementowania SuggestBox). Poniższe unika reimplementing SuggestBox:

private static class ScrollableDefaultSuggestionDisplay extends SuggestBox.DefaultSuggestionDisplay { 

    private Widget suggestionMenu; 

    @Override 
    protected Widget decorateSuggestionList(Widget suggestionList) { 
     suggestionMenu = suggestionList; 

     return suggestionList; 
    } 

    @Override 
    protected void moveSelectionDown() { 
     super.moveSelectionDown(); 
     scrollSelectedItemIntoView(); 
    } 

    @Override 
    protected void moveSelectionUp() { 
     super.moveSelectionUp(); 
     scrollSelectedItemIntoView(); 
    } 

    private void scrollSelectedItemIntoView() { 
     //          DIV   TABLE  TBODY  TR's 
     NodeList<Node> trList = suggestionMenu.getElement().getChild(1).getChild(0).getChildNodes(); 
     for (int trIndex = 0; trIndex < trList.getLength(); ++trIndex) { 
      Element trElement = (Element)trList.getItem(trIndex); 
      if (((Element)trElement.getChild(0)).getClassName().contains("selected")) { 
       trElement.scrollIntoView(); 

       break; 
     } 
    } 
} 

}

+0

Wygląda to intrygująco ... Mówisz, że to "unika reimplementowania SuggestBox" ... ale czy nie musisz przynajmniej ponownie zastosować konstruktora SuggestBox do skonstruowania za pomocą ScrollableDefaultSuggestionDisplay, a nie oryginalnego DefaultSuggestionDisplay? Dzięki! – cellepo

+0

Och, wydaje mi się, że wygląda na to, że musisz wywoływać publiczny 3-argumentowy konstruktor SuggestionBox, którego trzeci argument to SuggestionBox.SuggestionDisplay (którego typem jest Twój ScrollableDefaultSuggestionDisplay). – cellepo

+0

Tak, to działa ... genialne rozwiązanie @Perdi Estaquel! Jest to jedyne rozwiązanie znalezione w sieci, które nie włamuje się do SuggestBox. Wyobrażam sobie, że Mayumi zaakceptowałaby tę odpowiedź, gdyby przyszedł do nich, zanim odpowiedzieliby sobie ... – cellepo

1

Obserwuje this discussion o grupach Google I wdrożone podobne rozwiązanie, które jest nieco bardziej zwięzłe dzięki wykorzystaniu JSNI:

private class ScrollableDefaultSuggestionDisplay extends DefaultSuggestionDisplay { 

    @Override 
    protected void moveSelectionDown() { 
     super.moveSelectionDown(); 
     scrollSelectedItemIntoView(); 
    } 

    @Override 
    protected void moveSelectionUp() { 
     super.moveSelectionUp(); 
     scrollSelectedItemIntoView(); 
    } 

    private void scrollSelectedItemIntoView() { 
     getSelectedMenuItem().getElement().scrollIntoView(); 
    } 

    private native MenuItem getSelectedMenuItem() /*-{ 
     var menu = [email protected]Display::suggestionMenu; 
     return [email protected]::selectedItem; 
    }-*/; 
}