Java Jframe 问题更新 Jlist 使用对象的 arrayList 替换整个列表

Java Jframe issue updating Jlist replace entire list using arrayList of object

这是我第一次在这里寻求帮助,如果我做错了什么,请告诉我。我的母语是西班牙语,抱歉有些文字是西班牙语。我刚刚开始 java,所以如果您发现我的代码有问题(除了我要求的),请告诉我,谢谢。

解释代码: 我有一个表单,它通过“JtextFields”获取四个字符串,并在您按下按钮(通过 btAgregarRegistro 侦听器)后将它们放在 class“Cliente”的对象“cliente1”的属性上。然后我将对象添加到 arrayList

//Arraylist declaration
private List<Cliente> arregloClientes = new ArrayList<>();

//Add the object to the ArrayList
                arregloClientes.add(cliente1);

然后我更新 Jlist“listClientes”(在函数 actualizarLista() 上),以便您可以在添加记录后立即在表单上看到它。 该更新调用 class (Cliente) getDatosClientes 的方法,该方法将所有属性带到 DefaultListModel,然后将其显示在 Jlist 上 我的问题: 当我添加一条新记录时,我添加的最后一条记录会替换整个列表等等。因此,我的方法“getDatosClientes()”的第一个打印结果很好,但第二个打印结果替换了列表中的第一个。我会说问题出在更新上,但我已经尝试了很多东西,但似乎没有任何效果。我希望我正确地解释了自己。非常感谢!

这是全部代码:

Main.java(主要)

package nickoos;

public class Main
{
    public static void main(String[] args)
    {
        Formulario1();

    }

    public static void Formulario1()
    {
        Formulario frame1 = new Formulario(); //instanciar
        frame1.setContentPane(new Formulario().getPanel()); //mostrar el panel
        frame1.show();
        frame1.setSize(800,600);
        frame1.setLocation(600,230);
    }

}

Cliente.java (class)

package nickoos;

public class Cliente
{
    private String nombre;
    private String apellido;
    private String email;
    private String telefono;

    public Cliente(String nombre, String apellido, String email, String telefono)
    {
        this.nombre = nombre;
        this.apellido = apellido;
        this.email = email;
        this.telefono = telefono;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getDatosClientes()
    {
        return "Nombre: " + getNombre() + " Apellido: " + getApellido() + " Email: " + getEmail() + " Teléfono: " + getTelefono();
    }
}

Formulario.java(表格)

package nickoos;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

public class Formulario extends JFrame {
    private JButton btAgregarRegistro;
    private JPanel panel;
    private JLabel lbTitulo;
    private JLabel lbNombre;
    private JTextField txNombre;
    private JLabel lbApellido;
    private JLabel lbInstrucciones;
    private JLabel lbSimetria;
    private JLabel lbEmail;
    private JLabel lbTelefono;
    private JTextField txApellido;
    private JTextField txEmail;
    private JTextField txTelefono;
    private JList listClientes;
    private JLabel lbSubtituloLista;
    private JButton btEliminarRegistro;
    private JButton btModificarRegistro;
    private List<Cliente> arregloClientes = new ArrayList<>();

    //Instance the class
    Cliente cliente1 = new Cliente("","","","");


    public JPanel getPanel() {
        return panel;
    }


    public Formulario()
    {
        //Listener to add a record
        btAgregarRegistro.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {

                //Set the attributes to the object 
                cliente1.setNombre(txNombre.getText());
                cliente1.setApellido(txApellido.getText());
                cliente1.setEmail(txEmail.getText());
                cliente1.setTelefono(txTelefono.getText());

                //Add the object to the ArrayList
                arregloClientes.add(cliente1);

                //Update the list
                actualizarLista();

                //Clear textFields after adding the record
                blanquearCampos();
            }
        });

        //Listener "delete"
        btEliminarRegistro.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                int indice = listClientes.getSelectedIndex();
                arregloClientes.remove(indice);
                actualizarLista();

            }
        });
    }

    //Clear textFields
    private void blanquearCampos()
    {
        txNombre.setText("");
        txApellido.setText("");
        txEmail.setText("");
        txTelefono.setText("");
    }

    //Update list
    private void actualizarLista()
    {
        DefaultListModel datos = new DefaultListModel();

        for (int i = 0; i < arregloClientes.size(); i++)
        {
            Cliente index = arregloClientes.get(i);
            datos.addElement(index.getDatosClientes());
        }
        listClientes.setModel(datos);
    }

}

移动这条线

//Instance the class
Cliente cliente1 = new Cliente("","","","");

进入这个方法

btAgregarRegistro.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {

            //move it HERE

                //Set the attributes to the object 
                cliente1.setNombre(txNombre.getText());
                cliente1.setApellido(txApellido.getText());
                cliente1.setEmail(txEmail.getText());
                cliente1.setTelefono(txTelefono.getText());

                //Add the object to the ArrayList
                arregloClientes.add(cliente1);

                //Update the list
                actualizarLista();

                //Clear textFields after adding the record
                blanquearCampos();
            }
        });

发生的事情是您引用了内存中的同一个对象,只是更改了它的值。你想要做的是每次你想添加一个客户端时创建一个新对象。