2014-10-15 17 views
5

Tôi cần đặt lại các giá trị đã chọn trong một cây p:. Tôi tạo ra một nút đặt lại trong các hình thức mà tôi đặt p: phần tử cây của tôi. Nút đó đặt các giá trị được chọn của cây dưới dạng giá trị null. Trong bean sao lưu các giá trị rõ ràng khi tôi nhấn nút này. Nhưng trong giao diện ngay cả khi tôi làm mới trang, giá trị đã chọn cũ vẫn được đánh dấu. Đây là mã của tôi:Đặt lại p: giá trị được chọn cây

p: cây

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

Tạo cây:

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); 
     } 
    } 

Chức năng reset:

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

là gì sai trái trong mã của tôi?

Trả lời

3

Với những gợi ý này tôi nhận ra rằng tôi cần phải thiết lập lại các giá trị từ mảng đã chọn và cập nhật các nút trong cây. Vì vậy, tôi đã thực hiện các thay đổi sau trong mã của mình:

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); 
    } 
} 

Với những thay đổi này, tôi sửa mã của mình.

3

Bạn có thể đạt được bằng ví dụ dưới đây phương thức resetSelectedNode nào được sử dụng cho giá trị mới.

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

Xem thêm: Clear Input Components

+0

Tôi thử hàm resetSelectedNode của bạn trong bean phiên có nhiều lựa chọn và bất kỳ điều gì xảy ra: \. Có thể đưa ra một ví dụ cho trường hợp cụ thể này? – tech4

+0

@ tech4 Tôi đã đăng một ví dụ khác. – wittakarn

0

Đây là những gì tôi làm trong các dự án của tôi: tôi xác định phương pháp này, và gọi nó là bất cứ nơi nào tôi muốn.

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

thay vì ParentID, tôi thường được đặt dưới dạng id. nhưng đó là sự lựa chọn của bạn, bạn có thể đặt bất kỳ Id thành phần nào là parentId.

Một điều nữa, đây không phải là vấn đề về nguyên tố, giải pháp tôi đề xuất, áp dụng cho tất cả các dự án jsf2 và tất cả các thành phần đầu vào.

0

Ví dụ khác tại đây.

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

miền

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()); 
    } 
} 
Các vấn đề liên quan