【问题标题】:Unable to know deselected items when using "Move Selection" short-cut deselected something on a Tree使用“移动选择”快捷方式取消选择树上的某些内容时,无法知道取消选择的项目
【发布时间】:2012-12-27 05:50:25
【问题描述】:

我正在使用 ZK 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提供了用户可以使用updownPage UpPage Down的功能kbd>、HomeEnd 在树上到“Move Selection”。此操作还将发送有关新选定项目的选择事件,但不发送取消选定项目的事件。因此,当用户使用这些键时,以前的代码 sn-ps 不起作用。

我的问题是:

  1. 我应该怎么做才能准确知道用户“移动选择”时取消选择了哪些项目?
  2. 如果没有,我可以禁用这些键吗?

如果有人想知道,这里有一个 SSCCE 示例。 Or in 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());
        }
    }
}

ZUL:

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

【问题讨论】:

    标签: java zk


    【解决方案1】:

    这是合乎逻辑的,因为在事件驱动编程中这是一个好习惯
    每个用户操作只发送一个事件。但是您需要的所有信息
    在活动内部。
    请参阅 here on 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

    【讨论】:

    • 我明白为什么 ZK 不会一次发送多个事件。但是,这种行为对我来说仍然很奇怪,我想这只是因为我的代码过于依赖reference 而不是实际选择的数据。感谢您指出这一点。 +1 并被接受。
    猜你喜欢
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2011-08-17
    • 2017-08-13
    相关资源
    最近更新 更多