Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Primefaces选取列表源和目标未更新_Primefaces_Jsf 2 - Fatal编程技术网

Primefaces选取列表源和目标未更新

Primefaces选取列表源和目标未更新,primefaces,jsf-2,Primefaces,Jsf 2,当我从dataTable中选择一个组时,我想在pickList中显示相应的用户。当我在pickList中移动一些用户时,我希望这些新值甚至在提交值之前,或者在更改dataTable中的选择之前保存在bean的对象中 当我将用户从源pickList移动到目标pickList(反之亦然),然后更改dataTable中的选择时,pickList源值和目标值与填充时保持相同 User.java package com.test.model; public class User { privat

当我从dataTable中选择一个组时,我想在pickList中显示相应的用户。当我在pickList中移动一些用户时,我希望这些新值甚至在提交值之前,或者在更改dataTable中的选择之前保存在bean的对象中

当我将用户从源pickList移动到目标pickList(反之亦然),然后更改dataTable中的选择时,pickList源值和目标值与填充时保持相同

User.java

package com.test.model;

public class User {
    private String userName;

    public User(String userName) {
        this.userName = userName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}
Group.java

package com.test.model;

import java.util.List;

public class Group {
    private String groupName;
    private List<User> users;

    public Group(String groupName, List<User> users) {
        this.groupName = groupName;
        this.users = users;
    }

    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }
}
package com.test.model;
导入java.util.List;
公共课组{
私有字符串组名;
私人名单用户;
公共组(字符串groupName,列出用户){
this.groupName=groupName;
this.users=用户;
}
公共字符串getGroupName(){
返回groupName;
}
public void setGroupName(字符串groupName){
this.groupName=groupName;
}
公共列表getUsers(){
返回用户;
}
公共用户(列表用户){
this.users=用户;
}
}
UserBean.java

package com.test.beans;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import com.test.model.Group;
import com.test.model.User;
import org.primefaces.model.DualListModel;

@ManagedBean
@ViewScoped
public class UserBean {
    private List<Group> groups = new ArrayList<>();
    private List<User> allUsers = new ArrayList<>();
    private Group selectedGroup;
    private DualListModel<User> users = new DualListModel<>();

    public List<Group> getGroups() {
        return groups;
    }

    public Group getSelectedGroup() {
        return selectedGroup;
    }

    public void setSelectedGroup(Group selectedGroup) {
        this.selectedGroup = selectedGroup;
    }

    public DualListModel<User> getUsers() {
        return users;
    }

    public void setUsers(DualListModel<User> users) {
        this.users = users;
    }

    @PostConstruct
    private void init()  {
        List<User> usersGroup1 = new ArrayList<>();
        usersGroup1.add(new User("User1"));
        usersGroup1.add(new User("User2"));

        List<User> usersGroup2 = new ArrayList<>();
        usersGroup2.add(new User("User3"));
        usersGroup2.add(new User("User4"));

        allUsers.addAll(usersGroup1);
        allUsers.addAll(usersGroup2);

        groups.add(new Group("Group1", usersGroup1));
        groups.add(new Group("Group2", usersGroup2));
    }

    public void onRowSelect() {
        // here I want to save the picklist source, but it is already reset
        List<User> storeUsers = users.getSource();
        fillPickList();
    }

    private void fillPickList() {
        List<User> assignedUsers = new ArrayList<>();
        List<User> availableUsers = new ArrayList<>();

        assignedUsers.addAll(selectedGroup.getUsers());
        availableUsers.addAll(allUsers);

        for (User user : assignedUsers) {
            if (availableUsers.contains(user))
                availableUsers.remove(user);
        }

        users.setSource(assignedUsers);
        users.setTarget(availableUsers);
    }
}
package com.test.bean;
导入java.util.ArrayList;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ViewScoped;
导入com.test.model.Group;
导入com.test.model.User;
导入org.primefaces.model.DualListModel;
@ManagedBean
@视域
公共类用户bean{
私有列表组=新的ArrayList();
private List alluser=new ArrayList();
私有组selectedGroup;
私有DualListModel用户=新的DualListModel();
公共列表getGroups(){
返回组;
}
公共组getSelectedGroup(){
返回selectedGroup;
}
公共无效集合selectedGroup(Group selectedGroup){
this.selectedGroup=selectedGroup;
}
public DualListModel getUsers(){
返回用户;
}
公共void集合用户(DualListModel用户){
this.users=用户;
}
@施工后
私有void init(){
List usersGroup1=new ArrayList();
usersGroup1.add(新用户(“User1”));
usersGroup1.add(新用户(“User2”));
List usersGroup2=new ArrayList();
usersGroup2.add(新用户(“User3”));
usersGroup2.add(新用户(“User4”));
allUsers.addAll(usersGroup1);
allUsers.addAll(usersGroup2);
添加(新组(“Group1”,usersGroup1));
添加(新组(“Group2”,usersGroup2));
}
public void onRowSelect(){
//这里我想保存picklist源,但它已经被重置
List storeUsers=users.getSource();
fillPickList();
}
私有void fillPickList(){
List assignedUsers=new ArrayList();
List availableUsers=new ArrayList();
assignedUsers.addAll(selectedGroup.getUsers());
可用用户。添加所有(用户);
for(用户:assignedUsers){
if(availableUsers.contains(用户))
可用用户。删除(用户);
}
users.setSource(assignedUsers);
users.setTarget(可用用户);
}
}
index.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">

<h:head>
    <link rel="shortcut icon" type="image/x-icon" href="#{resource['images/favicon.ico']}"/>
</h:head>

<h:body>
    <h:form>
        <p:dataTable value="#{userBean.groups}"
                     var="group"
                     selectionMode="single"
                     selection="#{userBean.selectedGroup}"
                     rowKey="#{group.groupName}">
            <p:column headerText="Groups">
                <h:outputText value="#{group.groupName}"/>
            </p:column>
            <p:ajax event="rowSelect"
                    listener="#{userBean.onRowSelect}"
                    update="@form"/>
        </p:dataTable>

        <p:pickList value="#{userBean.users}"
                    var="user"
                    itemLabel="#{user.userName}"
                    itemValue="#{user.userName}"/>
    </h:form>
</h:body>
</html>

我通过创建一个
映射来解决这个问题,然后使用这个对象,并通过
公共无效onTransfer(TransferEvent事件)
方法在每次项目转移时更新它

但是我仍然不明白当它们不是动态更新时,
getSource()和
getTarget()方法是用来做什么的。

我这样解决了这个问题

我的xhtml:

<p:pickList id="pickObjList" value="#{myMB.objectList}" var="valor" itemLabel="#{valor}" itemValue="#{valor}" >
                            <p:ajax event="transfer" listener="#{manutParamMB.onAlterarPickList}" update="pickValorList"/>
                            <f:facet name="sourceCaption">Remove</f:facet>
                            <f:facet name="targetCaption">Add</f:facet>
                        </p:pickList>

请在开发模式下运行应用程序,查看是否有任何错误。并始终创建一个帮助我们确定问题可能在哪里的。现在有许多可能的原因是看不见的。在多个问题中“猜测”或询问更多细节太耗费时间了,我不理解这个问题。“我希望这些新值在提交值之前就保存在bean的对象中”-什么?您不希望将值发送到服务器,但希望它们仅显示在服务器上?我希望能够修改多个组中的用户,然后将这些更改全部保存在一起更改内容时,您不会将选取列表数据发送到服务器。也可以使用ajax。或者不在中处理选择列表thhttp://stackoverflow.com/questions/25339056/understanding-primefaces-process-update-and-jsf-fajax-execute-render-attributes. 可能会有所不同
public void onAlterarPickList(TransferEvent event) {
        for(Object item : event.getItems()) {
            
            if(event.isRemove()) {
                objectList.remove(item);
                log.info("Removed:"+item.toString());
            }
            else if(event.isAdd()) {
                objectList.add(item.toString());
                log.info("Added:"+item.toString());
            }
        }
    }