1

私は次の選択リストを実装しました:

<p:pickList id="pickList" value="#{reportConfiguratorBean.dualListVars}" var="cRVariable" itemValue="#{cRVariable}" itemLabel="#{cRVariable.varName}" converter="#{cRImageTypeConverter}" immediate="true" rendered="true" >
    <f:facet name="sourceCaption">Available Variables</f:facet>
    <f:facet name="targetCaption">Associated Variables</f:facet>                
</p:pickList>                       
<f:facet name="footer"> 
    <p:commandButton id='varassociate' action="#{reportConfiguratorBean.setAssocImTypVariables()}" value='Associate' process="@this,pickList" />
</f:facet>

選択リストが正しく入力されます(データベースのgetAssocImTypVariables()を使用)。しかし、私の問題は、ユーザーの変更された選択リスト値をキャプチャできず、ソースリストとターゲットリストを変更することです。次のように、commandButtonメソッド「setAssocImTypVariables」を使用して変更をキャプチャしようとしています。

public void setAssocImTypVariables() {      
    System.out.println(">>>>>>>>>>>>>>> entered");          
    List<CRVariable> sourceVariables = this.dualListVars.getSource();
    List<CRVariable> targetVariables = this.dualListVars.getTarget();       

    System.out.println(dualListVars.getSource());
    System.out.println(dualListVars.getTarget());

    for (CRVariable sourceVariable:sourceVariables) {
        System.out.println(">>>>>>>>>>>>> I am a source variable: " + sourceVariable.getVarName());
    }       
    for (CRVariable targetVariable:targetVariables) {
        System.out.println(">>>>>>>>>>>>> I am a target variable: " + targetVariable.getVarName());
    }       
    }

したがって、たとえば、INITIAL source =(Obj1、Obj2、Obj3、Obj5、Obj7)およびtarget =(Obj4、Obj6)の選択リストがある場合、コンソールで「Obj1」をソースからターゲットに移動します。

---------入力[][]

したがって、dualListVars(ソースとターゲット)は設定されていません!ソースとターゲットの2つの空のリストがあります...

だから私の方法は選択リストの変更を認識できません...何かアイデアはありますか?私はjava+primefacesを初めて使用するので、本当に基本的なものになる可能性があります:(

getAssocImTypesOnLoad()メソッドも添付しています。

public void getAssocImTypesOnLoad() {               
    Long imTypeId = Long.parseLong(virtualId);      
    List<CRVariable> source;
    List<CRVariable> target;        
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction tx = null;      
    try 
    {
        tx = session.beginTransaction();            
        String hq3 = "select distinct v from CRVariable v join v.crimagetypes t where t.id in (:itid)";
        Query query3 = session.createQuery(hq3);
        query3.setParameter("itid",imTypeId);
        target = query3.list();
        String hq4 = "select v FROM CRVariable v WHERE v.id not in (" +
                "select distinct v1.id " +
                "from CRVariable v1 " +
                "join v1.crimagetypes t2 " +
                "where t2.id in (:itid))";
        Query query4 = session.createQuery(hq4);
        query4.setParameter("itid",imTypeId);
        source = query4.list();
        dualListVars = new DualListModel<CRVariable>(source, target);
        tx.commit();
    } 
    catch (Exception e) 
    {
        if (tx != null) 
        {
            e.printStackTrace();
        }
    } 
    finally 
    {
       session.close();
    }
}
4

3 に答える 3

0

なぜimmediate=true属性を使用しているのcommandButtonですか?

私がそれを正しく覚えていれば、balusC の記事によると、ここでそれをチェックしてくださいimmediate=true。コマンドボタンで。をスキップする必要がありapply model to values phaseます。

たぶんそれが理由です、なぜあなたのモデルは更新されないのですか?

(コードを見て推測するだけです-私はこれを再現していません。)

于 2012-11-22T16:09:18.730 に答える
0

Primefacesのショーケースを詳しく見てみましょう: Primefacesの選択リスト

dualListVars直接お電話ください。dualListVarsはプロパティ(たとえば、ゲッターとセッターを持つプロパティ)であるため、#{reportConfiguratorBean.dualListVars}に解決されます。reportConfiguratorBean.getDualListVars()

<p:pickList id="pickList" value="#{reportConfiguratorBean.dualListVars}" var="cRVariable" itemValue="#{cRVariable}" itemLabel="#{cRVariable.varName}" converter="#{cRImageTypeConverter}" immediate="true" rendered="true" >
    <f:facet name="sourceCaption">Available Variables</f:facet>
    <f:facet name="targetCaption">Associated Variables</f:facet>                
</p:pickList> 

action属性は、ビジネスロジック用です。ここでソースとターゲットのリストをキャッチできます。process属性は、どのコンポーネントを処理するかをJSFに指示します。あなたの場合、コンポーネントpicklistcommandButtonを処理する必要があります。フォーム全体を。で処理することもできますprocess="@form"

<p:commandButton id='varassociate' action="#{reportConfiguratorBean.readMyAssocImTypVariables}" value='Associate' ajax='false' process="@this,pickList" immediate="true" />

readMyAssocImTypVariables関数:

 public void readMyAssocImTypVariables() {      
    List<CRVariable> sourceVariables = this.dualListVars.getSource();
    List<CRVariable> targetVariables = this.dualListVars.getTarget();       
    for (CRVariable sourceVariable:sourceVariables) {
        System.out.println(">>>>>>>>>>>>> I am a source variable: " + sourceVariable.getVarName());
    }       
    for (CRVariable targetVariable:targetVariables) {
        System.out.println(">>>>>>>>>>>>> I am a target variable: " + targetVariable.getVarName());
     }       
  }

無関係:ビジネスロジックをゲッター/セッターに入れないでください!それらはJSFによって複数回呼び出されます。

于 2012-11-22T15:36:14.970 に答える
0

実行中の選択リストの例picklist.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<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:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">


<h:head></h:head>

<h:body>
<h:form>
    <h3>Basic PickList</h3>
    <p:pickList value="#{pickListBean.cities}" var="city"
        itemLabel="#{city}" itemValue="#{city}" />
<p:commandButton  value="Submit" action="#{pickListBean.displayList}" />    


</h:form>

</h:body>
</html>   

PickListBean.java

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import org.primefaces.model.DualListModel;

@ManagedBean
public class PickListBean {

   private DualListModel<String> cities;

   public PickListBean() {

  //Cities
  List<String> citiesSource = new ArrayList<String>();
  List<String> citiesTarget = new ArrayList<String>();

  citiesSource.add("Istanbul");
  citiesSource.add("Ankara");
  citiesSource.add("Izmir");
  citiesSource.add("Antalya");
  citiesSource.add("Bursa");
//  citiesTarget.add("T1");


  cities = new DualListModel<String>(citiesSource, citiesTarget);
   }

   public DualListModel<String> getCities() {
      return cities;
   }
   public void setCities(DualListModel<String> cities) {
      this.cities = cities;
   }
   public void displayList(){

     System.out.println("values in list are" +cities.getTarget());


   }


}
于 2013-07-16T09:47:49.253 に答える