2015-08-08 4 views
8

В Vaadin 7.5.3 виджет Grid отвечает на пользователя, нажимая клавиши со стрелками вверх (↑) или вниз (↓), перемещая выделенное поле вокруг одной ячейки. Если пользователь затем выполняет второе действие, нажав клавишу SpaceBar, строка станет выделенной.Сразу же выберите строку со стрелкой в ​​Vaadin 7 Grid

Я смущен этим поведением. Я бы ожидал, что каждый удар клавиши со стрелкой сразу выберет следующую строку.

Есть ли способ, чтобы изменить поведение сетки, чтобы напрямую выбрать следующую строку, не требуя от вас второго жестов?

enter image description here

+0

Я так не считаю. Вы можете отключить свой сервер и заметить, что вы все же можете перемещаться по Grid с помощью клавиатуры - таким образом, эта функция работает на стороне клиента (javascript). – kukis

+0

@kukis Я не понимаю вашего комментария. Я спрашиваю, есть ли способ сделать нажатие клавиши и сразу выбрать следующий ряд (без второго нажатия клавиши). –

+0

По касательной ... ['InlineDateField'] (https://vaadin.com/api/com/vaadin/ui/InlineDateField.html) имеет аналогичное поведение с двумя клавишами. Справа-стрелка создает окно подсветки вокруг следующей даты в ежемесячном календаре. Чтобы на самом деле выбрать эту дату, вы должны сделать вторую комбинацию клавиш. Любопытная часть: второе нажатие клавиши - это клавиша RETURN, а не клавиша 'SPACE', используемая' Grid'. –

ответ

-1

Для справки, соответствующие vaadin forum topic about arrow navigation in grid. Кто-то даже разместил zip-файл с примером проекта.

Я просто попробовал это предложение, и, похоже, он работает, за исключением того, что теперь я получаю сообщения журнала «Игнорирование коннектора для несуществующего соединителя».

Решение включает в себя компиляцию собственного виджета, так что может быть больно настроить, если вы этого еще не сделали.

В пакете widgetset/клиента:

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

Где-то еще:

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

И использование:

new GridExtension().extend(grid); 

Обратите внимание, что это решение работает только для одной сетки в стр. В разделе форума vaadin также содержится предложение о том, как сделать эту работу для страниц с несколькими сетками на одной странице, но она не сразу компилируется для меня, поэтому я не включаю ее здесь.

 Смежные вопросы

  • Нет связанных вопросов^_^