Невозможно узнать невыбранные элементы при использовании ярлыка Move Selection, который отменил выбор чего-либо в дереве.

Я использую ЗК 6.5.1.

Иногда дерево может содержать некоторую логику, например делать что-то, когда пользователь выбирает/отменяет выбор элемента, это можно легко сделать, прослушивая подобное событие.

@Listen("onSelect = #tree")
public void onSelect(SelectEvent<Treeitem, String> event) {
    Treeitem ref = event.getReference();
    if (ref.isSelected()) {
        // do things when item is selected
    } else {
        // do things when item is deselected
    }
}

С другой стороны, ZK предоставляет функции, которые пользователь может использовать с помощью вверх, вниз, Page Up, Page Down, Главная, Конец на дереве в "Переместить выделение". Это действие также отправит событие выбора для нового выбранного элемента, но не отправит события для невыбранных элементов. Поэтому предыдущие фрагменты кода не работают, когда пользователь использует эти клавиши.

Мои вопросы:

  1. Как мне сделать, чтобы я мог точно знать, какие элементы отменяются, когда пользователь «Перемещает выделение»?
  2. Если нет, могу ли я отключить эти клавиши?

Вот пример SSCCE, если кто-то хочет знать. Или в ZKFiddle

Композитор:

public class TestComposer extends SelectorComposer<Div> {

    @Listen("onSelect = #tree")
    public void onSelect(SelectEvent<Treeitem, String> event) {
        Treeitem ref = event.getReference();
        if (ref.isSelected()) {
            Clients.log("Selected " + ref.getLabel());
        } else {
            Clients.log("Deselected " + ref.getLabel());
        }
    }
}

ЗУЛ:

<div apply="mytest.TestComposer">
    <tree id="tree" multiple="true" checkmark="true">
        <treechildren>
            <treeitem label="A" />
            <treeitem label="B" />
            <treeitem label="C" />
        </treechildren>
    </tree>
</div>

person Rangi Lin    schedule 27.12.2012    source источник


Ответы (1)


Это логично, потому что в программировании, управляемом событиями, хорошей практикой
является отправка только одного события на каждое действие пользователя. Но вся необходимая информация
находится внутри события.
См. здесь, на zk fiddle, как я улучшил ваш пример.
Я просто добавляю несколько строк в метод события.

@Listen("onSelect = #tree")
    public void onSelect(SelectEvent<Treeitem, String> event) {
        Treeitem ref = event.getReference();
        Set<Treeitem> newSelection = new HashSet<Treeitem>(event.getSelectedItems());
        if (ref.isSelected()) {
            if (selected != null) {
                Set<Treeitem> deselected = new HashSet<Treeitem>(selected);
                deselected.removeAll(newSelection);
                for (Treeitem t : deselected) {
                    Clients.log("Deselected " + t.getLabel());
                }
            }
            Clients.log("Selected " + ref.getLabel());
        } else {
            Clients.log("Deselected " + ref.getLabel());
        }
        selected = newSelection;
    }

Я использую java Set и теоретико-множественную логику для вычисления Set невыбранных элементов.

person Nabil A.    schedule 27.12.2012
comment
Я понимаю, почему ZK не будет отправлять несколько событий одновременно. Тем не менее, поведение по-прежнему выглядит странно для меня, я думаю, это просто потому, что мой код слишком сильно зависит от reference, а не от фактических выбранных данных. Спасибо, что указали на это. +1 и принято. - person Rangi Lin; 27.12.2012