В GWT, как узнать из SelectionEvent в дереве, если нажата кнопка Shift - PullRequest
3 голосов
/ 15 апреля 2010

Я пытаюсь в GWT создать дерево с множественным выбором для узлов и столкнулся с проблемой, подобной этому вопросу Shift Key в GWT? . Когда событие SelectionEvent вызывается из дерева, я хотел бы знать, нажата ли клавиша Shift или нет.

SelectionHandler<TreeItem> getSelectionHandler() {
    return new SelectionHandler<TreeItem>(){
        @Override
        public void onSelection(SelectionEvent<TreeItem> event) {
            // is shift key pressed ?
        }
    };
}

Решение в приведенном выше вопросе не может применяться в этом случае, так как класс SelectionHandler не наследуется от DOMEvent, а затем не имеет функции getNativeEvent ().

Я попробовал грязное решение, добавив keyDownEventHandler и keyUpEventHandler в дерево с логическим флагом, но обработчики вызываются только тогда, когда фокус находится на дереве, поэтому это не работает.

Есть ли простое решение (или просто решение, даже если оно не простое)? Благодаря.

Изменить ответ aem: Решение может работать, заключая компоненты в FocusPanel с помощью keyUp / DownHandler, но тогда я не могу добавить какой-либо компонент, требующий ввода с клавиатуры, такой как TextArea, так как «глобальный» обработчик имеет приоритет ... Так что это не решает моя проблема.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2010

Мое предложение состоит в том, чтобы создать пользовательский класс Tree, который временно сохраняет событие и сохраняет это событие путем переопределения метода onBrowseEvent. Затем вы можете, в вашем методе onSelection, проверить, была ли нажата клавиша Shift, проверив это сохраненное событие. Поскольку JavaScript не является одновременным, не должно быть проблем с использованием закрытой переменной. Код будет примерно таким:

public class MyTree extends Tree {
   private Event currentEvent;

   ... constructors...

   // Call this method from within the onSelection method to determine if the shift key
   // was pressed.
   public boolean isShiftPressed() {
      return currentEvent != null ? currentEvent.getShiftKey() : false;
   }

   @Override
   public void onBrowserEvent(Event event) {
     currentEvent = event;
     super.onBrowserEvent(event);
     currentEvent = null;
   }
}
1 голос
/ 16 апреля 2010

Я не уверен, будет ли это работать, но стоит попробовать:

Как насчет добавления обработчиков клавиш на корневую панель, содержащую дерево, и чтобы они установили логическое значение, указывающее, нажата ли клавиша Shift? Затем SelectionHandler дерева может проверить это логическое значение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...