2014-10-15 8 views
5

Ich muss die ausgewählten Werte in einem p: Baum zurücksetzen. Ich erstelle eine Reset-Schaltfläche in der Form, wo ich mein p: tree-Element. Diese Schaltfläche legte die ausgewählten Werte des Baums als Nullwerte fest. In der Backing Bean sind die Werte klar, wenn ich diese Taste drücke. Aber in der Schnittstelle auch wenn ich die Seite aktualisiere den alten ausgewählten Wert immer noch markiert. Hier ist mein Code:Reset p: Baum ausgewählte Werte

p: Baum

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

den Baum erstellen:

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

Die Reset-Funktion:

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

Was in meinem Code falsch?

Antwort

3

Mit diesen Vorschlägen erkannte ich, dass ich die Werte aus dem ausgewählten Array zurücksetzen und die Knoten in der Struktur aktualisieren muss. Also habe ich folgende Änderungen in meinem Code vorgenommen:

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

Mit diesen Änderungen behebe ich meinen Code.

3

Mit folgendem Beispiel erreichen Sie, welche Methode resetSelectedNode für neue Werte verwendet wird.

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

Siehe auch: Clear Input Components

+0

Ich versuche Ihre Funktion resetSelectedNode in einer Session-Bean mit einer Mehrfachauswahl und alles passieren: \. Könnte ein Beispiel für diesen speziellen Fall geben? – tech4

+0

@ tech4 Ich poste schon ein anderes Beispiel. – wittakarn

0

Dies ist, was ich in meinen Projekten zu tun: definiere ich diese Methode, und es nennen wo auch immer ich will.

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

anstelle des parentId, I normalerweise die Form ID gesetzt. Sie haben jedoch die Wahl. Sie können jede Komponenten-ID als parentId festlegen.

Noch eine Sache, dies ist kein Hauptproblem, die von mir vorgeschlagene Lösung gilt für alle jsf2-Projekte und alle Eingabekomponenten.

0

Ein anderes Beispiel hier.

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 Document

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

Domäne

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()); 
    } 
} 
Verwandte Themen