2012-10-04 7 views
1

J'utilise le composant glisser-déposer dans Richfaces4 et JSF2.objet DragDrop est nul lorsque vous utilisez ui: include

Quand je fais glisser l'action (premier panneau) dans le panneau cible tout fonctionne bien. Mais quand j'ai essayé de faire glisser et déposer l'objet (deuxième panneau) sur le panneau cible. Je reçois l'exception suivante:

EXCEPTION
debug[16:27:48.572]: Server returned responseText: <?xml version='1.0' encoding='UTF-8'?> <partial-response><error><error-name>class java.lang.NullPointerException</error-name><error-message><![CDATA[]]></error-message></error></partial-response> 
info [16:27:48.574]: Element error 
<error><error-name>class java.lang.NullPointerException</error-name><error-message><![CDATA[]]></error-message></error> 
debug[16:27:48.574]: richfaces.queue: ajax submit error 
debug[16:27:48.575]: richfaces.queue: Nothing to submit 
error[16:27:48.576]: Received '[email protected]' event from <div id=dropForm:list:0:j_idt42 class=rf-ind-drag ui-draggable ...> 
error[16:27:48.577]: [200] class java.lang.NullPointerException: 

PANNEAUX SOURCE

<rich:panel id="Object"> 

    <h:dataTable value="#{dropBean.objects}" var="object"> 
     <h:column> 
     <a4j:outputPanel layout="block"> 
      <rich:dragSource type="#{dropBean.objectType}" dragValue="#{object}" /> 
      <h:outputText value="#{object}"></h:outputText> 
     </a4j:outputPanel> 
     </h:column> 
     </h:dataTable> 
</rich:panel> 

CIBLE PANNEAU 1

<h:panelGrid columns="4"> 
    <rich:panel styleClass="idPanel" > 
    <rich:panel> 
    <rich:dropTarget acceptedTypes="ACTION" dropListener="#{dropBean.processDrop}" render="editPanel" /> 
    <rich:tooltip value="Drop here an Action..." /> 
    <a4j:outputPanel> 
    <h:outputText value="#{dropBean.currentLine.action}"></h:outputText> 
     </a4j:outputPanel> 
    </rich:panel> 
    <ui:include src="#{dropBean.pageByAction}" /> 
    <a4j:commandButton styleClass="opButtons" value="Add Step" action="#{dropBean.saveLine}" render="editPanel" /> 
</h:panelGrid> 

La ligne <ui:include src="#{dropBean.pageByAction}" /> obtenir la bonne page selon l'action que je suis tombé dans le premier groupe cible.

Voici un exemple de la page incluse (panneau cible 2):

CIBLE PANNEAU 2

<h:panelGrid columns="3"> 
    <rich:panel styleClass="itemPanel" bodyClass="itemPanelBody"> 
    <rich:dropTarget acceptedTypes="OBJECT" dropListener="#{dropBean.processDrop}" render="@form" /> 
    <rich:tooltip value="Drop here an Object..." /> 
    <a4j:outputPanel> 
    <h:outputText value="#{dropBean.currentLine.object}" /> 
    </a4j:outputPanel> 
    </rich:panel> 
</h:panelGrid> 

Si je retire le <ui:include src="#{dropBean.pageByAction}" /> et insérez le code directement l'opération se déroule de chute correctement. Mais de cette façon, les panneaux ne sont pas dynamiques. J'ai besoin de générer les panneaux en fonction de l'action que je choisis.

Autres choses que j'ai essayé alredy et ne fonctionnent pas:

  1. Insérer render = "forme @" "formName" "@all" en essayant de rendre toute la page.
  2. Modifiez la valeur de données pour l'autre composant, tel que rich: list et rich: dataGrid
  3. Utilisez immédiatement le composant cible drop.

Thks à l'avance,

Répondre

0

J'ai résolu le problème forçant la page à rafraîchir.

Procédé haricot du support appelé quand je faire glisser un objet dans le panneau cible.

public void processDrop(DropEvent event) { 

    //process event (not relevant code) 

    FacesContext context = FacesContext.getCurrentInstance(); 
    String viewId = context.getViewRoot().getViewId(); 
    ViewHandler handler = context.getApplication().getViewHandler(); 
    UIViewRoot root = handler.createView(context, viewId); 
    root.setViewId(viewId); 
    context.setViewRoot(root); 
} 

Je suis sûr que ce n'est pas la meilleure solution et je demande encore une meilleure solution. En attendant, je vais rester avec ça.

Si quelqu'un a une meilleure solution, s'il vous plaît laissez-moi savoir.

Questions connexes