当前位置: 首页 > 知识库问答 >
问题:

如何在ArrayList中检索已更改对象的索引?

梁丘琛
2023-03-14

我有一个web应用程序,它使用JSF中的数据表和Primefaces特性,以便它可以执行一些更动态的功能。在dataTable中,我有包含可编辑数据的行。我的最终目标是让用户能够编辑数据,单击save按钮,update语句将被执行以替换数据库中存在的内容。问题是,此时我不知道如何检测ArrayList中对象的更改。

我已经杀一儆百,看看有没有人能解决我的困境。听我说,我有一个代码制作了一个dataTable,在dataTable中是来自ArrayList的对象,每个对象包含三个不同的字符串。对象在DataTable中是可编辑的。我需要能够最低限度地检索在页面上编辑的对象的ArrayList索引。这样,我就可以形成一个新的编辑对象列表,并编写一个只对编辑的对象执行批更新的方法(在我的场景中,一个对象相当于数据库中的一行数据)。我以前的方法是遍历整个ArrayList并更新所有对象(行),但是,随着列表变大,这变得非常昂贵。现在我有一个primefaces方法onCellEdit,它告诉我一个前一个值以及它被更改为的值,但是没有办法确定对象被更改了。如有任何帮助,我们将不胜感激。下面的代码被设置为可以复制、粘贴和执行。

编辑:在我的情况下,我不需要更新ArrayList。这是使用页面上的输入以及bean的getter和setter自动完成的。我需要做的是知道哪些对象(行)被编辑,这样我就可以把它们拉到一边,执行数据库更新,在那里我只更新被编辑的内容。ArrayList是数据库中内容的镜像,但这里的目标是更新数据库以镜像编辑过的ArrayList,而不必遍历整个列表。

Prod.java

public class Prod{

private String value1;

private String value2;

private String value3;

public String getValue1() {
    return value1;
}

public void setValue1(String value1) {
    this.value1 = value1;
}

public String getValue2() {
    return value2;
}

public void setValue2(String value2) {
    this.value2 = value2;
}

public String getValue3() {
    return value3;
}

public void setValue3(String value3) {
    this.value3 = value3;
}

}
import java.io.IOException;
import java.util.ArrayList;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import org.primefaces.event.CellEditEvent;

import com.product.inventory.beans.Prod;



@ManagedBean(name = "listen")

@SessionScoped
public class Listen{

 private ArrayList<Prod> products;

 boolean firstEdit = true;


public Listen(){

}

public ArrayList<Prod> setup(){


    ArrayList<Prod> result = new ArrayList<>();     

    int numObject = 100;

    int iterations = 0;


    while( iterations < numObject){

        Prod prod = new Prod();

        prod.setValue1("A" + iterations);
        prod.setValue2("B" + iterations);
        prod.setValue3("C" + iterations);

     result.add(prod);

     iterations = iterations + 1;
    }

    return result;

}

public void onCellEdit(CellEditEvent event) {

  Object oldValue = event.getOldValue();
    Object newValue = event.getNewValue();

    if(newValue != null && !newValue.equals(oldValue)) {
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, 
"Cell Changed", "Old: " + oldValue + ", New:" + newValue);
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

if(isFirstEdit()){

    FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new 
FacesMessage(FacesMessage.SEVERITY_INFO,
                "Note",  "To confirm changes, please select 'Save Changes' 
or they will not be saved.") );

        this.setFirstEdit(false);

}

}

public void goTest(){

    System.out.println("Initializing...");

    this.products = setup();

    ExternalContext ec = FacesContext.getCurrentInstance()
            .getExternalContext();

    try {

         ec.redirect(ec.getRequestContextPath()
                    + "/test.xhtml");

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Table Structure Made");

}

public boolean isFirstEdit() {
    return firstEdit;
}

public void setFirstEdit(boolean firstEdit) {
    this.firstEdit = firstEdit;
}

public ArrayList<Prod> getProducts() {
    return products;
}

public void setProducts(ArrayList<Prod> products) {
    this.products = products;
}

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


<h:head>

</h:head>
<h:body>

<h:form id="form" method="post">

<p:growl id="msgs" showDetail="true" sticky="false">
    </p:growl>
    <div >

        <p:dataTable id="products" var="prod" value="#{listen.products}"
             scrollable="true" scrollHeight="900" 
             editable = "true" editMode="cell" widgetVar= "prodCell">

            <p:ajax event="cellEdit" listener="#{listen.onCellEdit}" 
            update=":form:msgs"/>

            <p:column filterBy="#{prod.value1}" filterMatchMode="contains" 
            style = "width: 300px;" headerText="Name">

                <p:cellEditor>

                    <f:facet name="output"><h:outputText value="# 
                    {prod.value1}" /></f:facet>

                    <f:facet name="input"><p:inputTextarea rows="2" value="# 
                    {prod.value1}" style = "width: 96%"/></f:facet>
                </p:cellEditor>

            </p:column>

            <p:column style = "width: 140px;" headerText="Vendor">

                <p:cellEditor >

                    <f:facet name="output"><h:outputText value="# 
                    {prod.value2}" /></f:facet>

                    <f:facet name="input">
                        <h:selectOneMenu value="#{prod.value2}" 
                        style="width:100%">
                            <f:selectItem itemValue="Y" itemLabel="Yes"/>
                            <f:selectItem itemValue="N" itemLabel="No"/>
                        </h:selectOneMenu>

                    </f:facet>

                </p:cellEditor>

            </p:column>


            <p:column style = "width: 275px;" headerText="Version Release">

                <p:cellEditor>  
                    <f:facet name="output"><h:outputText value="# 
                    {prod.value3}" /></f:facet>

                    <f:facet name="input"><p:inputTextarea rows="1" value="# 
                    {prod.value3}" style = "width: 96%"/></f:facet>

                </p:cellEditor>
            </p:column> 

            <f:facet name="footer">
            <div align = "left">
            <p:commandButton value="post" action="#{tables.showChange}" 
            ajax="false"></p:commandButton>
            </div>
            </f:facet>


        </p:dataTable>

    </div>

     <p:contextMenu for="products" widgetVar="pMenu">   
    <p:menuitem value="Edit Cell" icon="pi pi-search" 
     onclick="PF('prodCell').showCellEditor();return false;"/>  
    <p:menuitem value="Hide Menu" icon="pi pi-times" 
     onclick="PF('pMenu').hide()"/>  
</p:contextMenu> 

</h:form>

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


<h:head>

</h:head>
<h:body>

<h:form method="post">

<h:commandButton value = "Contact Spreadsheet" ajax="false" 
action="#{listen.goTest}" ></h:commandButton>
</h:form>
</h:body>
</html>

共有1个答案

关志勇
2023-03-14

您想要的解决方案是用于您要查找的行为的PrimeFaces扩展表组件

Sheet填充了使用单元格内编辑的PrimeFaces Datatable未填充的需求。它可以通过编辑单个单元格来处理大量数据,而无需提交整个工作表。提供熟悉的电子表格导航与TAB和shift+TAB和熟悉的电子表格体验。

功能包括:

    null

基于HandsonCode的Handsontable。

 类似资料:
  • 我有一个ArrayList,里面有一堆MyObject对象。我想在我的对象中保留一个整数字段,它是ArrayList中这个对象的键,这样我就可以很容易地得到这个元素在ArrayList中的位置。 当我从这个ArrayList中删除一个对象时,会出现问题,因为索引会向左移动。避免这个问题的最佳方法是什么? 我应该不删除元素,而是用null覆盖它们(这样索引就不会移位),还是应该在删除一次之后遍历Ar

  • 对于我当前的项目,我必须搜索ArrayList of ZipCode对象,以便找到距离用户输入的int zip最远的ZipCode。 下面是编写我遇到问题的方法的说明:public ZipCode findfurtwest(int-pZip)-查找距离提供的邮政编码最远的ZipCode。如果未找到邮政编码,则返回null。例如,距离邮政编码75234最远的是ADAK,AK 99546。 在我的代码

  • 问题内容: 我有一堂课。它具有以下特征; 它具有2个属性,和。1个人可以拥有许多电话,因此您可能会在下面看到具有多个ID的人。 还有另一门课叫。它将有一个称为的方法。 personList,具有3-4个Person对象。我需要搜索PersonArrayList并找到与Person对象匹配的对象。我怎样才能做到这一点? 注意:我尝试过。但这是行不通的。 问题答案: 我尝试了personList.co

  • 我试图根据用户输入找到一个特定的对象。用户需要输入姓名和性别,然后程序应该搜索ArrayList,查看是否有匹配的姓名和性别。ArrayList中的对象有3个实例变量,但程序只搜索2个。如何在ArrayList中只搜索选定的几个特征? 在我的项目中,我有: 其中,nameList是ArrayList的名称,getName()是返回存储在对象中的名称的方法的名称,getGender()是返回存储在对

  • 问题内容: 我的arraylist包含String数组对象。我如何获得所有价值?我的代码如下 如果我尝试像上面给出的那样进行检索, 怎么做? 问题答案: 您还必须遍历字符串数组。