有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javazk,自定义组件。一个值的不同功能(加载和保存)

ZK框架。我有自定义组件v_dualListbox。祖尔:

<hlayout hflex="1"> <listbox id="candidateLb" hflex="1" vflex="true" multiple="true" rows="8"> <template name="model"> <listitem> <listcell label="${each.description}"/> </listitem> </template> </listbox> <vbox spacing="10px" width="24px"> <image style="cursor:pointer" id="chooseAllBtn" src="/img/001_25.png"/> <image style="cursor:pointer" id="chooseBtn" src="/img/001_25.png"/> <image style="cursor:pointer" id="removeBtn" src="/img/001_27.png"/> <image style="cursor:pointer" id="removeAllBtn" src="/img/001_27.png"/> </vbox> <listbox id="chosenLb" hflex="1" vflex="true" multiple="true" rows="8"> <template name="model"> <listitem> <listcell label="${each.description}"/> </listitem> </template> </listbox> </hlayout>

我在zul页面上使用它:

<?component name="dual-listbox" extends="div" class="ru.it_constanta.pguAdmin.components.DualListbox"?> <dual-listbox id="scopeDualLBox" chosenDataList="@bind(vm.orgScopeList)" model="@bind(vm.scopeList)"/>

双重列表框。爪哇:

package ru.it_constanta.pguAdmin.components;

import ...
public class DualListbox<T> extends HtmlMacroComponent implements IdSpace {

private static final long serialVersionUID = 5183321186606483396L;

@Wire
private Listbox candidateLb;
@Wire
private Listbox chosenLb;

private ListModelList<T> candidateModel = new ListModelList<>();
private ListModelList<T> chosenDataModel = new ListModelList<>();

private boolean isLoad = false;

public DualListbox() {
    Executions.createComponents("v_dualListbox.zul", this, null);
    Selectors.wireComponents(this, this, false);
    Selectors.wireEventListeners(this, this);
    chosenLb.setModel(chosenDataModel = new ListModelList<T>());
    chosenDataModel.setMultiple(true);
}

@Listen("onClick = #chooseBtn")
public void chooseItem() {
    Events.postEvent(new ChooseEvent(this, chooseOne()));
}

@Listen("onClick = #removeBtn")
public void unchooseItem() {
    Events.postEvent(new ChooseEvent(this, unchooseOne()));
}

@Listen("onClick = #chooseAllBtn")
public void chooseAllItem() {
    Events.postEvent(new ChooseEvent(this, chooseAll()));
}

@Listen("onClick = #removeAllBtn")
public void unchooseAllItem() {
    Events.postEvent(new ChooseEvent(this, unchooseAll()));
}

/**
 * Set new candidate ListModelList.
 *
 * @param candidate is the data of candidate list model
 */
public void setModel(List<T> candidate) {
    candidateLb.setModel(this.candidateModel = new ListModelList<>(candidate));
    this.candidateModel.setMultiple(true);
    chosenDataModel.clear();
}

@ComponentAnnotation(
        "@ZKBIND(ACCESS=load, LOAD_EVENT=onLoad)")
public void setChosenDataList(List<T> chosen) {
    chosenDataModel.addAll(chosen);
    candidateModel.removeAll(chosen);
}

/**
 * @return current chosen data list
 */
@ComponentAnnotation(
        "@ZKBIND(ACCESS=save, SAVE_EVENT=onChoose)")
public List<T> getChosenDataList() {
    return new ArrayList<>(chosenDataModel);
}

private Set<T> chooseOne() {
    Set<T> set = candidateModel.getSelection();
    chosenDataModel.addAll(set);
    candidateModel.removeAll(set);
    return set;
}

private Set<T> unchooseOne() {
    Set<T> set = chosenDataModel.getSelection();
    candidateModel.addAll(set);
    chosenDataModel.removeAll(set);
    return set;
}

private Set<T> chooseAll() {
    chosenDataModel.addAll(candidateModel);
    candidateModel.clear();
    return chosenDataModel.getSelection();
}

private Set<T> unchooseAll() {
    candidateModel.addAll(chosenDataModel);
    chosenDataModel.clear();
    return candidateModel.getSelection();
}

// Customized Event
public class ChooseEvent extends Event {
    private static final long serialVersionUID = -7334906383953342976L;

    public ChooseEvent(Component target, Set<T> data) {
        super("onChoose", target, data);
    }
}
}

数据来自数据库。在加载页面上,我想把对象已有的实体列表(orgScopeList)放在chosenLb列表框中。我使用chosenDataList属性来实现这一点。我还想将所选对象保存在同一个列表(orgScopeList)中,即当客户端选择更多实体或取消选择它时,我想将其保存在orgScopeList中,这就是为什么我使用@bind注释(用于加载和保存)。因此,我需要监听两个事件onLoad和onChoose以获取两个命令(load和save)。我用@ComponentAnnotation编写了两个方法,但setChosenDataList不起作用,加载页面上什么也没发生,我不知道为什么。 我希望有人能理解我:)请帮帮我


共 (1) 个答案

  1. # 1 楼答案

    多亏了Malte Hartwig的回答,他的两个建议都起作用了(仅在getter上使用@ComponentAnnotations,并使用onCreate事件作为LOAD_事件),所以这就是我现在在DualListbox中的内容。爪哇:

    public void setChosenDataList(List<T> chosen) {
        chosenDataModel.clear();
        chosenDataModel.addAll(chosen);
        candidateModel.removeAll(chosen);
    }
    
    @ComponentAnnotation(
            "@ZKBIND(ACCESS=both, SAVE_EVENT=onChoose, LOAD_EVENT=onCreate)")
    public List<T> getChosenDataList() {
        return new ArrayList<>(chosenDataModel);
    }
    

    但重要的是要记住,LOAD_事件也在SAVE_事件之后工作,这就是为什么要编写chosenDataModel.clear();