2014-10-15 3 views
5

Мне нужно сбросить выбранные значения в дереве p:. Я создаю кнопку сброса в форме, где я помещаю свой элемент p: tree. Эта кнопка помещает выбранные значения дерева в нулевые значения. В бэкэнд-компоненте значения становятся ясными, когда я нажимаю эту кнопку. Но в интерфейсе, даже когда я обновляю страницу, старое выделенное значение все еще отмечено. Вот мой код:Сброс 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; 
} 

Что плохого в моем коде?

ответ

3

С этими предложениями я понял, что мне нужно сбросить значения из выбранного массива и обновить узлы в дереве. Поэтому в моем коде были внесены следующие изменения:

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

Вы можете получить ниже пример того, какой метод 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

@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

+0

Я пытаюсь выполнить функцию resetSelectedNode в сеансовом компоненте с множественным выбором и что-то произойдет: \. Может привести пример для этого конкретного случая? – tech4

+0

@ tech4 Я уже опубликовал другой пример. – wittakarn

0

Это то, что я в своих проектах: Я определяю этот метод, и назвать его везде, где я хочу.

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

вместо parentId, обычно я устанавливаю идентификатор формы. но это ваш выбор, вы можете установить любой идентификатор компонента как parentId.

Еще одна вещь, это не проблема с перфораторами, решение, которое я предлагаю, относится ко всем проектам jsf2 и ко всем входным компонентам.

0

Другой пример здесь.

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> 

managedbean 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 
    } 
} 

managedbean DocumentService

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()); 
    } 
} 
Смежные вопросы