2015-08-08 17 views
8

In Vaadin 7.5.3 reagiert das Widget Grid auf den Benutzer Drücken der Aufwärts (↑) oder Abwärts (↓) Pfeiltasten durch Bewegen eines Markierungsfelds um eine einzelne Zelle. Wenn der Benutzer dann eine zweite Aktion ausführt und die Leertaste drückt, wird die Zeile zur Auswahl.Sofort Zeile mit Pfeiltaste in Vaadin 7 Grid auswählen

Ich bin von diesem Verhalten verwirrt. Ich hätte jeden Schlag einer Pfeiltaste erwartet, um sofort die nächste Reihe auszuwählen.

Gibt es eine Möglichkeit, das Verhalten des Rasters zu ändern, um die nächste Zeile direkt auszuwählen, ohne eine zweite Geste des Benutzers zu erfordern?

enter image description here

+0

Ich glaube nicht. Sie können Ihren Server herunterfahren und feststellen, dass Sie immer noch mit der Tastatur durch das Grid navigieren können - diese Funktionalität funktioniert also auf einer Client-Seite (Javascript). – kukis

+0

@kukis Ich verstehe deinen Kommentar nicht. Ich frage, ob es eine Möglichkeit gibt, einen Tastendruck auszuführen und sofort die nächste Zeile auszuwählen (ohne einen zweiten Tastendruck). –

+0

Auf einer Tangente ... Das ['InlineDateField'] (https://vaadin.com/api/com/vaadin/ui/InlineDateField.html) hat ein ähnliches Zwei-Tasten-Verhalten. Right-Arrow erzeugt ein Markierungsfeld um das nächste Datum im Monatskalender herum. Um das Datum tatsächlich auszuwählen, müssen Sie einen zweiten Tastendruck ausführen. Der kuriose Teil: Der zweite Tastendruck ist eine 'RETURN'-Taste anstelle der' SPACE'-Taste, die von 'Grid' verwendet wird. –

Antwort

-1

Als Referenz der entsprechende vaadin forum topic about arrow navigation in grid. Jemand hat sogar eine Zip-Datei mit einem Beispielprojekt gepostet.

Ich habe gerade diesen Vorschlag ausprobiert, und es scheint zu funktionieren, außer dass ich jetzt "Log-Nachrichten ignorieren Connector Anfrage für nicht existierende Connector" bekomme.

Die Lösung besteht darin, ein eigenes Widgetset zu kompilieren, so dass es sehr mühsam sein kann, es einzurichten, wenn Sie dies noch nicht getan haben.

Im Widgetset/Client-Paket:

@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(); 
    } 
    }-*/; 
} 

Irgendwo anders:

@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); 
    } 
} 

Und die Nutzung:

new GridExtension().extend(grid); 

Beachten Sie, dass diese Lösung funktioniert nur für ein einzelnes Gitter pro Seite. Der vaadin Forum-Thread enthält auch einen Vorschlag, wie dies für Seiten mit mehreren Gittern auf der gleichen Seite funktioniert, aber es kompilierte nicht sofort für mich, also schließe ich es hier nicht ein.