2017-01-16 3 views
0

Я использую пригодные для использования типы поверхностей. В событии rowSelect я вызываю listener onRowSelect, где я назначаю выбранную строку на две переменные объекта, например, selectedRow и editRow.Переменные объектов имеют одно и то же значение eventhoug изменяется только одна переменная объекта

Когда пользователь нажимает кнопку «Редактировать», входы вносятся в переменные объекта editRow, а при обновлении значений в bean-файле измененная переменная имеет одинаковое значение как в объектах «selectedRow», так и «editRow».

Класс модели выглядит следующим образом.

public class SalesMen { 

private int salesMen_id; 
private String salesMen_email1; 

public SalesMen() { 
} 

public int getSalesMen_id() { 
    return salesMen_id; 
} 

public void setSalesMen_id(int salesMen_id) { 
    this.salesMen_id = salesMen_id; 
} 

public String getSalesMen_email1() { 
    return salesMen_email1; 
} 

public void setSalesMen_email1(String salesMen_email1) { 
    this.salesMen_email1 = salesMen_email1; 
} 

}

Моего Xhtml что просматривать продавец детали следующим образом.

<ui:define name="contentPanel"> 

    <div style="margin-bottom: 10px; margin-top: 10px"> 
     <p:growl id="growl" showDetail="true"/> 
     <h:form id="form1"> 
      <div class="w3-margin-top"> 
       <h:commandButton type="cmdAdd" action="frmSalesMenAdd.xhtml?faces-redirect=true" value="Add" /> 
       <h:outputText value="&#160;"/> 

       <h:commandButton type="cmdEdit" action="frmSalesMenEdit.xhtml?faces-redirect=true" value="Edit" disabled="#{salesMenBean.selectedSalesMen eq null}" /> 
       <h:outputText value="&#160;"/> 
      </div> 
     </h:form> 
     <div> 
      <h:form id="frmDgvBanking"> 
       <p:dataTable id ="dgvBanking" 
          var = "dtBanking" 
          value="#{salesMenBean.salesMens}" 
          selectionMode="single" 
          selection="#{salesMenBean.selectedSalesMen}" 
          rowKey="#{dtBanking.salesMen_id}" 
          scrollable="true" 
          resizableColumns="true" 
          scrollHeight="450" 
          scrollRows="50" 
          scrollWidth="100%" 
          widgetVar="SaleMen Table"> 

        <p:ajax event="rowSelect" listener="#{salesMenBean.onRowSelect}" update=":form1 :frmDgvBanking :growl :frmDgvBanking:dgvBanking "/> 

        <p:column headerText="SalesMenEmail" > 
         <h:outputText value="#{dtBanking.salesMen_email1}" /> 
        </p:column> 
       </p:dataTable> 
      </h:form> 
     </div> 
    </div> 
</ui:define> 

При нажатии кнопки «Изменить» выполняется следующий Xhtml.

<ui:define name="contentPanel"> 

    <div style="margin: auto; width: 60%"> 
     <p:growl id="growl" showDetail="true"/> 

     <h:form id="form1">    
      <p:panelGrid id="pg" columns="2"> 
       <p:outputLabel for="txtEmail" value="Email id:"/> 
       <p:inputText id="txtEmail" value="#{salesMenBean.editSalesMen.salesMen_email1}" /> 
      </p:panelGrid> 
      <h:commandButton id="cmdSave" action="#{salesMenBean.UpdateSalesMen(salesMenBean.editSalesMen)}" value="Save" /> 
     </h:form> 
    </div> 
</ui:define> 

ПродавцыСид заключается в следующем.

@SessionScoped 
@Named("salesMenBean") 

public class SalesMenBean implements Serializable { 

private SalesMen salesmen; 
private List<SalesMen> salesMens; 
private SalesMen selectedSalesMen; 
private SalesMen editSalesMen; 

public SalesMenBean() { 
    salesmen = new SalesMen(); 
} 

public List<SalesMen> getSalesMens() { 
    salesMens = loadSalesMenListFromDb(); 
    return salesMens; 
} 

public void setSalesMens(List<SalesMen> salesMens) { 
    this.salesMens = salesMens; 
} 

private List<SalesMen> loadSalesMenListFromDb() { 
    List<SalesMen> list = new ArrayList<>(); 

    ... reading values from table and adding to list 

    return list; 
} 

public void onRowSelect(SelectEvent event) { 
    selectedSalesMen = ((SalesMen) event.getObject()); 
    editSalesMen = ((SalesMen) event.getObject()); 

    FacesMessage msg = new FacesMessage(selectedSalesMen.getSalesMen_Name()); 
    FacesContext context = FacesContext.getCurrentInstance(); 
    context.addMessage(null, msg); 
} 

public String UpdateSalesMen(SalesMen editSm) { 
    System.out.println("Selected Salesmen email id is " + this.selectedSalesMen.getSalesMen_email1()); 
    System.out.println("Edited Salesmen email id is " + editSm.getSalesMen_email1()); 

    // The values above printed are same. 
    // I expect the editSm.getSalesMen_email1 should have the new value entered in the edit xhtml and selectedSalesMen.getSalesMen_email1 should hold the old value. But not happening 

    .... other updating codes are here 
} 

Будет ли кто-то поможет мне, почему selectedRow и EditRow объектов переменных получить одинаковые значения Eventhough я редактировать только EditRow объект переменных (salesMenBean.editSalesMen.salesMen_email1).

спасибо.

+0

Спасибо всем. Я понял причину ошибки (ссылка на объект передается только). Ссылка, приведенная в разделе «Этот вопрос уже имеет ответ здесь:« Кажется, у меня нет ответа на мой вопрос или я ничего не прошу от него? ». На данный момент я использовал конструктор копирования для удовлетворения моих требований. Еще раз, спасибо. –

ответ

-1

При использовании event.getObject() вы получите ссылку на объект, а не новый, это означает, что ваш selectedSalesMen и editSalesMen указывают на тот же объект в памяти, что, почему «как» объекты меняются, если вы хотите их быть два разных объекта вы можете создать новый объект для editSalesMen, а затем присвоить ему значения свойств selectedSalesMen

selectedSalesMen = ((SalesMen) event.getObject()); 
SalesMen editSalesMen = new SalesMen(); 
editSalesMen.setSalesMen_id(selectedSalesMen.getSalesMen_id()); 
editSalesMen.setSalesMen_email1(selectedSalesMen.getSalesMen_email1());