2015-08-08 39 views
8

W Vaadin 7.5.3 widget Grid odpowiada użytkownikowi naciskając klawisze strzałek w górę (↑) lub w dół (↓), przesuwając pole wyróżnienia wokół pojedynczej komórki. Jeśli użytkownik wykona drugą akcję, naciskając klawisz spacji, wiersz staje się wyborem.Natychmiastowy wybór wiersza za pomocą klawisza strzałki w Vaadin 7 Grid

Jestem zdezorientowany tym zachowaniem. Spodziewałbym się każdego uderzenia klawisza Strzałek, aby natychmiast wybrać następny wiersz.

Czy jest jakiś sposób, aby zmienić zachowanie siatki, aby bezpośrednio wybrać następny wiersz bez konieczności wykonywania drugiego gestu przez użytkownika?

enter image description here

+0

Nie sądzę. Możesz wyłączyć serwer i zauważyć, że nadal możesz poruszać się po Gridzie za pomocą klawiatury - dlatego ta funkcjonalność działa po stronie klienta (javascript). – kukis

+0

@kukis Nie rozumiem Twojego komentarza. Pytam, czy istnieje sposób na naciśnięcie klawisza i natychmiast wybierz następny wiersz (bez drugiego naciśnięcia klawisza). –

+0

Na stycznej ... ['InlineDateField'] (https://vaadin.com/api/com/vaadin/ui/InlineDateField.html) ma podobne zachowanie w dwóch naciśnięciach klawisza. Strzałka w prawo powoduje wyświetlenie pola podświetlenia wokół kolejnej daty w kalendarzu miesięcznym. Aby rzeczywiście wybrać tę datę, musisz wykonać drugie naciśnięcie klawisza. Ciekawostka: Drugie naciśnięcie klawisza to klawisz 'RETURN' zamiast klawisza' SPACE' używany przez 'Grid'. –

Odpowiedz

-1

Dla porównania, odpowiadająca vaadin forum topic about arrow navigation in grid. Ktoś opublikował nawet plik ZIP z przykładowym projektem.

Po prostu wypróbowałem tę sugestię i wygląda na to, że działa, oprócz tego, że otrzymuję teraz komunikat "Ignorowanie żądania złącza dla nieistniejącego złącza".

Rozwiązanie polega na kompilowaniu własnego zestawu widgetów, więc może to być kłopotliwe w konfiguracji, jeśli jeszcze tego nie zrobiłeś.

W pakiecie widgetset/klienckim:

@Connect(GridExtension.class) 
public class GridExtensionConnector extends AbstractExtensionConnector 
{ 
    @Override 
    protected void extend(ServerConnector target) 
    { 
    GridConnector gridConnector = (GridConnector) target; 

    final Grid<JsonObject> grid = gridConnector.getWidget(); 

    grid.addDomHandler(new KeyDownHandler() { 
     @Override 
     public void onKeyDown(KeyDownEvent event) 
     { 
     if(event.getNativeKeyCode() == 40) 
     { 
      selectFocused(); 
     } 
     else if(event.getNativeKeyCode() == 38) 
     { 
      selectFocused(); 
     } 
     } 
    }, KeyDownEvent.getType()); 
    } 

    public static void selectFocused() 
    { 
    Timer timer = new Timer() { 
     @Override 
     public void run() 
     { 
     execClick(); 
     } 
    }; 

    timer.schedule(10); 
    } 

    public static native void execClick() /*-{ 
    // only click if focused row is not already selected 
    if(!$wnd.$(".v-grid-body .v-grid-row-focused .v-grid-row-selected").length) 
    { 
     $wnd.$(".v-grid-body .v-grid-cell-focused").click(); 
    } 
    }-*/; 
} 

gdzieś indziej:

@JavaScript({ "https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js" }) 
public class GridExtension extends AbstractExtension 
{ 
    public void extend(Grid grid) 
    { 
    super.extend(grid); 
    } 
} 

a użycie:

new GridExtension().extend(grid); 

Zauważ, że to rozwiązanie działa tylko na jednym ruszcie za strona. Wątek forum vaadin zawiera także sugestię, jak to zrobić dla stron z wieloma siatkami na tej samej stronie, ale nie skompilował się od razu, więc nie uwzględniam go tutaj.