【问题标题】:Reset p:tree selected values重置 p:tree 选择的值
【发布时间】:2014-10-15 11:16:12
【问题描述】:

我需要重置 p:tree 中的选定值。我以放置 p:tree 元素的形式创建了一个重置​​按钮。该按钮将树的选定值作为空值。当我按下这个按钮时,在支持 bean 中的值是清晰的。但是在界面中,即使我刷新页面,旧的选定值仍然被标记。这是我的代码:

p:树

<p:tree id="treeClassifier" 
        value="#{navBarController.rootClassifier}" 
        var="node"          
        selectionMode="checkbox" 
        selection="#{navBarController.selectedClassifiers}" 
        style="height: 100px;width: 280px; margin-bottom: 0px; overflow: auto">
      <p:treeNode expandedIcon="ui-icon-folder-open" 
                  collapsedIcon="ui-icon-folder-collapsed">
         <h:outputText value="#{node.description}(#{node.code})"/> 
      </p:treeNode> 
</p:tree>

创建树:

public TreeNode initTree(GenericTree<Classifier> tree) {
        GenericTreeNode<Classifier> root = tree.getRoot();
        TreeNode rootJSF = new DefaultTreeNode("root", null);
        for (GenericTreeNode<Classifier> gnt : root.getChildren()) {
            if (gnt.getData().getId() != -1) {
                TreeNode childTree = new DefaultTreeNode(gnt.getData(), rootJSF);
                //rootJSF.getChildren().add(childTree);
                //f_aux(gnt, rootJSF);
                addChildsToTree(gnt, childTree);
            }
        }
        return rootJSF;
    }

    public void addChildsToTree(GenericTreeNode<Classifier> parent, TreeNode parentJSF) {
        for (GenericTreeNode<Classifier> child : parent.getChildren()) {
            TreeNode newNode = new DefaultTreeNode(child.getData(), parentJSF);
            //parentJSF.getChildren().add(newNode);
            addChildsToTree(child, newNode);
        }
    }

重置功能:

public void reset() {
       ....
       this.selectedClassifiers = null;
}

我的代码有什么问题?

【问题讨论】:

    标签: primefaces tree reset


    【解决方案1】:

    您可以通过下面的示例来实现使用 resetSelectedNode 方法来更新值。

    xhtml

    <h:form>
        <p:growl id="msgs" showDetail="true" escape="false"/>
        <p:inputText value="#{treeSelectionView.input}" />
        <h3 style="margin-top:0">Single</h3>
        <p:tree value="#{treeSelectionView.root1}" 
                id="simpleSelection"
                var="doc"
                selectionMode="single"
                selection="#{treeSelectionView.selectedNode}"
                dynamic="true">
            <p:treeNode expandedIcon="ui-icon-folder-open" 
                        collapsedIcon="ui-icon-folder-collapsed">
                <h:outputText value="#{doc.name}"/>
            </p:treeNode>
            <p:treeNode type="document" icon="ui-icon-document">
                <h:outputText value="#{doc.name}" />
            </p:treeNode>
            <p:treeNode type="picture" icon="ui-icon-image">
                <h:outputText value="#{doc.name}" />
            </p:treeNode>
            <p:treeNode type="mp3" icon="ui-icon-video">
                <h:outputText value="#{doc.name}" />
            </p:treeNode>
        </p:tree>
    
        <p:commandButton value="Display" 
                         update="msgs" 
                         icon="ui-icon-newwin"
                         actionListener="#{treeSelectionView.displaySelectedSingle}"/>
        <p:commandButton value="Reset" 
                         update="simpleSelection" 
                         icon="ui-icon-newwin"
                         process="@this"
                         actionListener="#{treeSelectionView.resetSelectedNode}" />
    </h:form>
    

    托管豆

    @ManagedBean(name = "treeSelectionView")
    @ViewScoped
    public class SelectionView implements Serializable {
    
        private TreeNode root1;
        private TreeNode selectedNode;
        private String input;
    
        public String getInput() {
            return input;
        }
    
        public void setInput(String input) {
            this.input = input;
        }
    
        @ManagedProperty("#{documentService}")
        private DocumentService service;
    
        @PostConstruct
        public void init() {
            root1 = service.createDocuments();
        }
    
        public TreeNode getRoot1() {
            return root1;
        }
    
        public TreeNode getSelectedNode() {
            return selectedNode;
        }
    
        public void setSelectedNode(TreeNode selectedNode) {
            this.selectedNode = selectedNode;
        }
    
        public void setService(DocumentService service) {
            this.service = service;
        }
    
        public void displaySelectedSingle() {
            System.out.println("input: " + input);
            if (selectedNode != null) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selected", selectedNode.getData().toString());
                FacesContext.getCurrentInstance().addMessage(null, message);
            }
        }
    
        public void resetSelectedNode(ActionEvent event) {
            FacesContext context = FacesContext.getCurrentInstance();
            Application application = context.getApplication();
            ViewHandler viewHandler = application.getViewHandler();
            UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
            context.setViewRoot(viewRoot);
            context.renderResponse(); //Optional
        }
    }
    

    另请参阅:Clear Input Components

    【讨论】:

    • 我在一个会话 bean 中尝试了你的函数 resetSelectedNode 并进行了多项选择,但任何事情都会发生:\。可以举一个这个具体案例的例子吗?
    【解决方案2】:

    有了这些建议,我意识到我需要重置所选数组中的值并更新树中的节点。所以我在我的代码中做了以下更改:

    public void reset() {
           ....
           this.selectedClassifiers = null;
           this.rootNode = initTree(tree);
    }
    
        public TreeNode initTree(GenericTree<Classifier> tree) {
           GenericTreeNode<Classifier> root = tree.getRoot();
           TreeNode rootJSF = new DefaultTreeNode("root", null);
           rootJSF.setSelected(false);
           for (GenericTreeNode<Classifier> gnt : root.getChildren()) {
             if (gnt.getData().getId() != -1) {
                TreeNode childTree = new DefaultTreeNode(gnt.getData(), rootJSF);
                childTree.setSelected(false);
                addChildsToTree(gnt, childTree);
             }
        }
        return rootJSF;
     }
    
    public void addChildsToTree(GenericTreeNode<Classifier> parent, TreeNode parentJSF) {
        for (GenericTreeNode<Classifier> child : parent.getChildren()) {
            TreeNode newNode = new DefaultTreeNode(child.getData(), parentJSF);
            newNode.setSelected(false);
            addChildsToTree(child, newNode);
        }
    }
    

    通过这些更改,我修复了我的代码。

    【讨论】:

      【解决方案3】:

      这里是另一个例子。

      XHTML

      <?xml version="1.0" encoding="UTF-8"?>
      <!--
      To change this license header, choose License Headers in Project Properties.
      To change this template file, choose Tools | Templates
      and open the template in the editor.
      -->
      <!DOCTYPE html>
      <html xmlns="http://www.w3.org/1999/xhtml"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:p="http://primefaces.org/ui">
          <h:head>
              <f:facet name="first">
                  <meta http-equiv="Content-Type" 
                        content="text/html; charset=UTF-8" />
                  <meta name="viewport" 
                        content="user-scalable=no, 
                        width=device-width, 
                        initial-scale=1.0, 
                        maximum-scale=1.0"/>
              </f:facet>
      
              <title>Tree provides three selection modes, "single", "multiple" and "checkbox".</title>
          </h:head>
      
          <h:body id="bodyView">
              <h:form>
                  <p:growl id="msgs" showDetail="true" escape="false"/>
      
                  <h3 style="margin-top:0">Single</h3>
                  <p:tree value="#{treeSelectionView.root1}" 
                          id="simpleSelection"
                          var="doc"
                          selectionMode="single"
                          selection="#{treeSelectionView.selectedNode}">
                      <p:treeNode expandedIcon="ui-icon-folder-open" 
                                  collapsedIcon="ui-icon-folder-collapsed">
                          <h:outputText value="#{doc.name}"/>
                      </p:treeNode>
                      <p:treeNode type="document" icon="ui-icon-document">
                          <h:outputText value="#{doc.name}" />
                      </p:treeNode>
                      <p:treeNode type="picture" icon="ui-icon-image">
                          <h:outputText value="#{doc.name}" />
                      </p:treeNode>
                      <p:treeNode type="mp3" icon="ui-icon-video">
                          <h:outputText value="#{doc.name}" />
                      </p:treeNode>
                  </p:tree>
      
                  <p:commandButton value="Display" 
                                   update="msgs" 
                                   icon="ui-icon-newwin"
                                   actionListener="#{treeSelectionView.displaySelectedSingle}"/>
                  <p:commandButton value="Reset" 
                                   update="simpleSelection" 
                                   icon="ui-icon-newwin"
                                   process="@this"
                                   actionListener="#{treeSelectionView.resetSelectedNode}" />
      
                  <h3>Multiple with metakey</h3>
                  <p:tree id="multipleSelection"
                          value="#{treeSelectionView.root1}" 
                          var="doc"
                          selectionMode="multiple"
                          selection="#{treeSelectionView.selectedNodes1}">
                      <p:treeNode expandedIcon="ui-icon-folder-open" 
                                  collapsedIcon="ui-icon-folder-collapsed">
                          <h:outputText value="#{doc.name}"/>
                      </p:treeNode>
                      <p:treeNode type="document" icon="ui-icon-document">
                          <h:outputText value="#{doc.name}" />
                      </p:treeNode>
                      <p:treeNode type="picture" icon="ui-icon-image">
                          <h:outputText value="#{doc.name}" />
                      </p:treeNode>
                      <p:treeNode type="mp3" icon="ui-icon-video">
                          <h:outputText value="#{doc.name}" />
                      </p:treeNode>
                  </p:tree>
      
                  <p:commandButton value="Display" 
                                   update="msgs" 
                                   icon="ui-icon-newwin"
                                   actionListener="#{treeSelectionView.displaySelectedMultiple(treeSelectionView.selectedNodes1)}"/>
                  <p:commandButton value="Reset" 
                                   update="multipleSelection" 
                                   icon="ui-icon-newwin"
                                   process="@this"
                                   actionListener="#{treeSelectionView.resetSelectedNode}" />
      
                  <h3>Multiple with Checkbox</h3>
                  <p:tree id="checkboxSelection"
                          value="#{treeSelectionView.root1}" 
                          var="doc"
                          selectionMode="checkbox"
                          selection="#{treeSelectionView.selectedNodes2}">
                      <p:treeNode icon="ui-icon-note">
                          <h:outputText value="#{doc.name}"/>
                      </p:treeNode>
                      <p:treeNode type="document" icon="ui-icon-document">
                          <h:outputText value="#{doc.name}" />
                      </p:treeNode>
                      <p:treeNode type="picture" icon="ui-icon-image">
                          <h:outputText value="#{doc.name}" />
                      </p:treeNode>
                      <p:treeNode type="mp3" icon="ui-icon-video">
                          <h:outputText value="#{doc.name}" />
                      </p:treeNode>
                  </p:tree>
      
                  <p:commandButton value="Display" 
                                   update="msgs" 
                                   icon="ui-icon-newwin"
                                   actionListener="#{treeSelectionView.displaySelectedMultiple(treeSelectionView.selectedNodes2)}"/>
                  <p:commandButton value="Reset" 
                                   update="checkboxSelection" 
                                   icon="ui-icon-newwin"
                                   process="@this"
                                   actionListener="#{treeSelectionView.resetSelectedNode}" />
              </h:form>
          </h:body>
      </html>
      

      托管bean treeSelectionView

      import java.io.Serializable;
      import javax.annotation.PostConstruct;
      import javax.faces.application.Application;
      import javax.faces.application.FacesMessage;
      import javax.faces.application.ViewHandler;
      import javax.faces.bean.ManagedBean;
      import javax.faces.bean.ManagedProperty;
      import javax.faces.bean.ViewScoped;
      import javax.faces.component.UIViewRoot;
      import javax.faces.context.FacesContext;
      import javax.faces.event.ActionEvent;
      import org.primefaces.model.TreeNode;
      import org.primefaces.showcase.service.DocumentService;
      
      @ManagedBean(name = "treeSelectionView")
      @ViewScoped
      public class SelectionView implements Serializable {
      
          private TreeNode root1;
          private TreeNode root2;
          private TreeNode root3;
          private TreeNode selectedNode;
          private TreeNode[] selectedNodes1;
          private TreeNode[] selectedNodes2;
      
          @ManagedProperty("#{documentService}")
          private DocumentService service;
      
          @PostConstruct
          public void init() {
              root1 = service.createDocuments();
              root2 = service.createDocuments();
              root3 = service.createDocuments();
          }
      
          public TreeNode getRoot1() {
              return root1;
          }
      
          public TreeNode getRoot2() {
              return root2;
          }
      
          public TreeNode getRoot3() {
              return root3;
          }
      
          public TreeNode getSelectedNode() {
              return selectedNode;
          }
      
          public void setSelectedNode(TreeNode selectedNode) {
              this.selectedNode = selectedNode;
          }
      
          public TreeNode[] getSelectedNodes1() {
              return selectedNodes1;
          }
      
          public void setSelectedNodes1(TreeNode[] selectedNodes1) {
              this.selectedNodes1 = selectedNodes1;
          }
      
          public TreeNode[] getSelectedNodes2() {
              return selectedNodes2;
          }
      
          public void setSelectedNodes2(TreeNode[] selectedNodes2) {
              this.selectedNodes2 = selectedNodes2;
          }
      
          public void setService(DocumentService service) {
              this.service = service;
          }
      
          public void displaySelectedSingle() {
              if (selectedNode != null) {
                  FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selected", selectedNode.getData().toString());
                  FacesContext.getCurrentInstance().addMessage(null, message);
              }
          }
      
          public void displaySelectedMultiple(TreeNode[] nodes) {
              if (nodes != null && nodes.length > 0) {
                  StringBuilder builder = new StringBuilder();
      
                  for (TreeNode node : nodes) {
                      builder.append(node.getData().toString());
                      builder.append("<br />");
                  }
      
                  FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selected", builder.toString());
                  FacesContext.getCurrentInstance().addMessage(null, message);
              }
          }
      
          public void resetSelectedNode(ActionEvent event) {
              FacesContext context = FacesContext.getCurrentInstance();
              Application application = context.getApplication();
              ViewHandler viewHandler = application.getViewHandler();
              UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
              context.setViewRoot(viewRoot);
              context.renderResponse(); //Optional
          }
      }
      

      托管bean文档服务

      import javax.faces.bean.ApplicationScoped;
      import javax.faces.bean.ManagedBean;
      import org.primefaces.model.DefaultTreeNode;
      import org.primefaces.model.TreeNode;
      import org.primefaces.showcase.domain.Document;
      
      @ManagedBean(name = "documentService")
      @ApplicationScoped
      public class DocumentService {
      
          public TreeNode createDocuments() {
              TreeNode root = new DefaultTreeNode(new Document("Files", "-", "Folder"), null);
      
              TreeNode documents = new DefaultTreeNode(new Document("Documents", "-", "Folder"), root);
              TreeNode pictures = new DefaultTreeNode(new Document("Pictures", "-", "Folder"), root);
              TreeNode movies = new DefaultTreeNode(new Document("Movies", "-", "Folder"), root);
      
              TreeNode work = new DefaultTreeNode(new Document("Work", "-", "Folder"), documents);
              TreeNode primefaces = new DefaultTreeNode(new Document("PrimeFaces", "-", "Folder"), documents);
      
              //Documents
              TreeNode expenses = new DefaultTreeNode("document", new Document("Expenses.doc", "30 KB", "Word Document"), work);
              TreeNode resume = new DefaultTreeNode("document", new Document("Resume.doc", "10 KB", "Word Document"), work);
              TreeNode refdoc = new DefaultTreeNode("document", new Document("RefDoc.pages", "40 KB", "Pages Document"), primefaces);
      
              //Pictures
              TreeNode barca = new DefaultTreeNode("picture", new Document("barcelona.jpg", "30 KB", "JPEG Image"), pictures);
              TreeNode primelogo = new DefaultTreeNode("picture", new Document("logo.jpg", "45 KB", "JPEG Image"), pictures);
              TreeNode optimus = new DefaultTreeNode("picture", new Document("optimusprime.png", "96 KB", "PNG Image"), pictures);
      
              //Movies
              TreeNode pacino = new DefaultTreeNode(new Document("Al Pacino", "-", "Folder"), movies);
              TreeNode deniro = new DefaultTreeNode(new Document("Robert De Niro", "-", "Folder"), movies);
      
              TreeNode scarface = new DefaultTreeNode("mp3", new Document("Scarface", "15 GB", "Movie File"), pacino);
              TreeNode carlitosWay = new DefaultTreeNode("mp3", new Document("Carlitos' Way", "24 GB", "Movie File"), pacino);
      
              TreeNode goodfellas = new DefaultTreeNode("mp3", new Document("Goodfellas", "23 GB", "Movie File"), deniro);
              TreeNode untouchables = new DefaultTreeNode("mp3", new Document("Untouchables", "17 GB", "Movie File"), deniro);
      
              return root;
          }
      }
      

      域名

      import java.io.Serializable;
      
      public class Document implements Serializable, Comparable<Document> {
      
          private String name;
      
          private String size;
      
          private String type;
      
          public Document(String name, String size, String type) {
              this.name = name;
              this.size = size;
              this.type = type;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getSize() {
              return size;
          }
      
          public void setSize(String size) {
              this.size = size;
          }
      
          public String getType() {
              return type;
          }
      
          public void setType(String type) {
              this.type = type;
          }
      
          //Eclipse Generated hashCode and equals
          @Override
          public int hashCode() {
              final int prime = 31;
              int result = 1;
              result = prime * result + ((name == null) ? 0 : name.hashCode());
              result = prime * result + ((size == null) ? 0 : size.hashCode());
              result = prime * result + ((type == null) ? 0 : type.hashCode());
              return result;
          }
      
          @Override
          public boolean equals(Object obj) {
              if (this == obj) {
                  return true;
              }
              if (obj == null) {
                  return false;
              }
              if (getClass() != obj.getClass()) {
                  return false;
              }
              Document other = (Document) obj;
              if (name == null) {
                  if (other.name != null) {
                      return false;
                  }
              } else if (!name.equals(other.name)) {
                  return false;
              }
              if (size == null) {
                  if (other.size != null) {
                      return false;
                  }
              } else if (!size.equals(other.size)) {
                  return false;
              }
              if (type == null) {
                  if (other.type != null) {
                      return false;
                  }
              } else if (!type.equals(other.type)) {
                  return false;
              }
              return true;
          }
      
          @Override
          public String toString() {
              return name;
          }
      
          public int compareTo(Document document) {
              return this.getName().compareTo(document.getName());
          }
      }
      

      【讨论】:

        【解决方案4】:

        这就是我在项目中所做的: 我定义了这个方法,并在我想调用的任何地方调用它。

        public static void resetAllInputChildren(String parentId) {
            FacesContext currentInstance = FacesContext.getCurrentInstance();
            if (currentInstance != null && currentInstance.getViewRoot() != null) {
                RequestContext.getCurrentInstance().reset(parentId);
            }
        }
        

        我通常设置表单 ID,而不是 parentId。但这是您的选择,您可以将任何组件 ID 设置为 parentId。

        还有一点,这不是 primefaces 问题,我建议的解决方案适用于所有 jsf2 项目,以及所有输入组件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-26
          • 1970-01-01
          • 2017-01-28
          • 2016-05-20
          • 2023-02-16
          • 2013-05-30
          • 2016-03-19
          • 1970-01-01
          相关资源
          最近更新 更多